0
struct MyStruct
{
    MyStruct() {}
};
struct MySndStruct
{
    MySndStruct() {}
};

template <typename T> 
T Func(const T& t = T()) 
{ 
    T ret;
    return ret;
}

template <> 
MyStruct Func<MyStruct>(const MyStruct& ms)
{
    MyStruct ret;
    return ret;
}
int main()
{
    Func<MySndStruct>();
    Func<MySndStruct>(); // Works

    Func<MyStruct>();
    Func<MyStruct>(); // Fails
    Func<MyStruct>(MyStruct()); // Works fine
    return 0;
}

Func 的 MyStruct 特化的第二次调用失败,在 Visual C++ 2010 中出现以下错误

error C2440: 'default argument' : cannot convert from 'MyStruct *' to 'MyStruct &

如果我通过值而不是通过引用(MyStruct Func<MyStruct>(MyStruct ms))传递错误变为

fatal error C1001: An internal error has occurred in the compiler.

这是 Microsoft 的 c++ 编译器中的错误,还是模板专业化不支持默认参数?

例如,如果有人可以向我解释这里发生了什么,为什么编译器会假定一个指针被传入,而 IMO 显然不是?为什么第一次调用有效?我认为它与实例化模板有关,但我想更准确地知道。

编辑:将参数更新为 const 以强调这对 Visual C++ 2010 没有影响。

4

1 回答 1

1

替换T Func(T& t = T())T Func(const T& = T()),它应该编译得很好。

于 2012-09-06T12:35:20.713 回答