#c #templates #gcc #compiler-errors #c 14
#c #шаблоны #gcc #ошибки компилятора #c 14
Вопрос:
Приведенный ниже код компилируется в MSVC, но завершается ошибкой в GCC (4.6.3). Почему происходит сбой и что я должен сделать, чтобы это исправить?
#include <array>
class Foo {
public:
template<typename T, int N>
operator std::array<T, N>() const {
return std::array<T, N>();
}
};
int main(){
Foo val;
// both of the following lines fail on GCC with error:
// "no matching function call...", ultimately with a note:
// "template argument deduction/substitution failed"
auto a = val.operator std::array<int, 2>();
static_cast<std::array<int, 2>>(val);
return 0;
}
РЕДАКТИРОВАТЬ: следующий код, однако, компилируется (на обоих компиляторах), несмотря на передачу параметра шаблона int
for std::array
.
template<int N, typename T>
struct Bar {
std::array<T, N> buf;
};
int main()
{
auto x = Bar<3, double>();
return 0;
}
Ответ №1:
Если вы прочитали полный текст сообщений об ошибках, которые вы получаете, компилятор жалуется, потому что тип for N
в вашем классе шаблона is int
, а второй параметр std::array
is std::size_t
, который является an unsigned long
в вашей системе.
Изменение объявления вашего шаблона для использования std::size_t N
устранит проблему.
MSVC не жалуется, возможно, потому, что он признает, что значение «2» работает в любом случае, или из-за ошибки компилятора.
Комментарии:
1. И clang, и gcc принимают это , поэтому это больше похоже на ошибку с их стороны.
2. @1201ProgramAlarm Мне тоже было интересно об этом, но почему тогда 2-й фрагмент кода (в РЕДАКТИРОВАНИИ моего вопроса) компилируется без ошибок?
3. Для MSVC это ошибка в нашем компиляторе. Мы открыли внутреннюю проблему, чтобы отследить ее, спасибо!