Rozważmy następujący kod:Odrzucanie argumentów szablonu: który kompilator jest właśnie tutaj?
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);
}
Tutaj Vector
reprezentuje klasę, która jest zdefiniowana w bibliotece stron trzecich, a std::array
jest znany do podjęcia jego elementem liczyć jako std::size_t
.
Próbowałem skompilować to z clang-3.6 i g ++ - 5.1. Dzyń pracował bez zarzutu, natomiast g ++ daje następujący błąd:
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>’
mogę obejść ten wykonując obsady N
do std::size_t
w drugim parametrze doWork()
lub dzwoniąc doWork<3>()
, ale to nie będzie mnie kształcić.
Więc raczej zapytam najpierw: który kompilator jest właśnie tutaj? Czy naprawdę robię coś złego w kodzie (więc klang jest zbyt permisywny), czy rzeczywiście jest to poprawne C++ (tak, że g ++ ma błąd)?