Сбой вывода / замены аргумента шаблона GCC - PullRequest
1 голос
/ 22 апреля 2019

Код ниже компилируется в 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 для std::array 'Параметр шаблона s.

template<int N, typename T>
struct Bar {
    std::array<T, N> buf;
};

int main()
{
    auto x = Bar<3, double>();
    return 0;
}

1 Ответ

0 голосов
/ 22 апреля 2019

Если вы прочитаете полный текст полученных сообщений об ошибках, компилятор будет жаловаться, потому что тип N в вашем шаблонном классе - int, а второй параметр std::array - std::size_t, чтоunsigned long в вашей системе.

Изменение объявления вашего шаблона для использования std::size_t N решит проблему.

MSVC, возможно, не будет жаловаться, потому что распознает, что значение "2" работаетв любом случае, или из-за ошибки компилятора.

...