環境
- Microsoft Visual Studio Community 2019
- Version 16.10.0
- c++latest
問題
次のコードは上の環境でコンパイルエラーです.
質問:コンパイラのバグなのか,文法のエラーなのか,それとも別の原因なのかが知りたい
#include <iostream> enum class Color { RED }; template<typename T, template <auto,typename> typename U> concept AA = true; template<typename T, template <typename> typename U> concept BB = true; template<typename T, template <auto> typename U> concept CC = true; template<Color, std::integral T> struct A {}; template<std::integral T> struct B {}; template<Color> struct C {}; template<AA<A> T> void aa(T v) { std::cout << typeid(v).name(); } template<BB<B> T> void bb(T v) { std::cout << typeid(v).name(); } template<CC<C> T> void cc(T v) { std::cout << typeid(v).name(); } int main() { A<Color::RED,int> a; //aa(a);//error B<int> b; bb(b);//ok C<Color::RED> c; cc(c);//ok }
C2672 'aa': 一致するオーバーロードされた関数が見つかりませんでした。 C7602 'aa': 関連する制約が満たされていません
詳細
auto typename
typename
auto
の三種類のconcept
を作成します.
template<typename T, template <auto,typename> typename U> concept AA = true; template<typename T, template <typename> typename U> concept BB = true; template<typename T, template <auto> typename U> concept CC = true;
それらを使って関数に渡される型を制約します.
-conceptAA
conceptBB
conceptCC
それぞれ作成します.
template<AA<A> T> void aa(T v) { std::cout << typeid(v).name(); } template<BB<B> T> void bb(T v) { std::cout << typeid(v).name(); } template<CC<C> T> void cc(T v) { std::cout << typeid(v).name(); }
テスト用のクラスをそれぞれ作成して,
template<Color, std::integral T> struct A {}; template<std::integral T> struct B {}; template<Color> struct C {};
main関数で呼びます.
int main() { A<Color::RED,int> a; //aa(a);//error B<int> b; bb(b);//ok C<Color::RED> c; cc(c);//ok }
関数aa
以外は問題なく動作します.
別のコンパイラで確認したところ動作するようです.
別のコンパイラ
gcc11.1.0
->ok
clang13.0.0
->ok
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/11 05:50