在第二次调用时使用默认参数时,为什么此模板特化失败?

时间:2012-09-06 11:51:20

标签: c++ visual-studio-2010 templates

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

1 个答案:

答案 0 :(得分:1)

T Func(T& t = T())替换为T Func(const T& = T()),并且编译正常。