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 没有影响。