GCC模板参数推导/替换失败

时间:2019-04-22 13:53:49

标签: c++ templates gcc compiler-errors 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的模板参数传入了std::array,但以下代码仍(在两个编译器上)进行了编译。

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

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

1 个答案:

答案 0 :(得分:0)

如果您阅读错误消息的全文,则编译器会抱怨,因为模板类中N的类型是int,而std::array的第二个参数是std::size_t,它是系统上的unsigned long

更改模板的声明以使用std::size_t N将解决此问题。

MSVC不会抱怨,可能是因为它认识到值“ 2”在任何情况下都有效,或者是由于编译器错误所致。