は、次のコードを考えてみましょう。ここでテンプレート引数の減算:どのコンパイラがここにありますか?
template<int N>
class Vector
{
};
#include <array>
template<int N>
void doWork(const Vector<N>&, const std::array<int,N>&)
{
}
int main()
{
std::array<int,3> arr;
Vector<3> vec;
doWork(vec,arr);
}
Vector
は、サードパーティのライブラリで定義されたクラスを表し、std::array
はstd::size_t
としての要素数を取ることが知られています。 5.1 -
私が打ち鳴らす-3.6とg ++でこれをコンパイルしようとしました。
test.cpp: In function ‘int main()’:
test.cpp:17:19: error: no matching function for call to ‘doWork(Vector<3>&, std::array<int, 3ul>&)’
doWork(vec,arr);
^
test.cpp:9:6: note: candidate: template<int N> void doWork(const Vector<N>&, const std::array<int, N>&)
void doWork(const Vector<N>&, const std::array<int,N>&)
^
test.cpp:9:6: note: template argument deduction/substitution failed:
test.cpp:17:19: note: mismatched types ‘int’ and ‘long unsigned int’
doWork(vec,arr);
^
test.cpp:17:19: note: ‘std::array<int, 3ul>’ is not derived from ‘const std::array<int, N>’
私はdoWork()
の2番目のパラメータでstd::size_t
にN
のキャストをやったりdoWork<3>()
を呼び出すことによって、この問題を回避することができますが、これは私を教育しません:G ++が次のエラーを与える一方でクランは、苦情なしで働いていました。
だから私はむしろ、最初に尋ねる:これは、コンパイラはここですか?私は実際にコードで何か間違っていますか(clangはあまりにも容認しやすいですか)、それとも本当に有効なC++ですか(g ++にはバグがあります)?