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没有影响。
答案 0 :(得分:1)
将T Func(T& t = T())
替换为T Func(const T& = T())
,并且编译正常。