msvcでテンプレートテンプレートのバグ
備忘録も兼ねて
Visual Studioさんいつも変なバグありません?
テンプレートテンプレートを使った次のコード
#include <type_traits>
template <template <class...>class Temp, class Ins>
struct is_template_instance : std::false_type {};
template <template <class...>class Temp, class ...Args>
struct is_template_instance<Temp, Temp<Args...>> : std::true_type {};
template <template <class...>class Temp, class Ins>
inline constexpr bool is_template_instance_v = is_template_instance<Temp, Ins>::value;
template <class T>
struct Foo {
template <class U>
static constexpr bool is_foo = is_template_instance<Foo, U>::value;
};
template <class T>
struct Bar {
template <class U>
static constexpr bool is_bar = is_template_instance_v<Bar, U>;
};
static_assert(Foo<int>::is_foo<Foo<double>>);
static_assert(Bar<int>::is_bar<Bar<double>>);
visual studio 2019 ではコンパイルできない
Fooの方はstatic_assertで失敗していて
Barの方はis_template_instance_v<Bar, U>
のBarが引数を省略したクラスとして扱わてしまっているみたい
コミュニティに回避策が上がってた
https://developercommunity.visualstudio.com/content/problem/558979/c-template-template-not-recognized-as-class-templa.html
呼び出し側をちょっといじるとコンパイル通るみたい
is_template_instance_v<::Foo, U>;
なんでこれでFooもBarもコンパイル通るようになるんだ...?(どういうバグなんだ...)
ただ、名前空間内にあると(その場合の方が多いような気がするけど)
is_template_instance_v<ns::Foo, U>;
みたいに長くなってしまう。MSさんはよ直して...
余談?
Author And Source
この問題について(msvcでテンプレートテンプレートのバグ), 我々は、より多くの情報をここで見つけました https://qiita.com/tyu_ru_cpp/items/2c23a5424f2ae8778b4a著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .