Ошибка вычета / замены аргумента шаблона GCC

#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 это ошибка в нашем компиляторе. Мы открыли внутреннюю проблему, чтобы отследить ее, спасибо!