转换运算符使用默认模板参数

时间:2016-01-17 11:13:38

标签: c++ templates conversion-operator

我想知道following code

有什么问题
template<typename T, typename U = T> 
    operator U() 
    {
        return U();
    }

它失败了error: no matching function for call to 'Test1::Test1(Test&)',而following code上的转换成功了:

template<typename T> 
    operator T() 
    {
        return T();
    }

完整的代码:

https://ideone.com/yWVtgR

class Test
{
    public:
        template<typename T, typename U = T> 
        operator U() 
        {
            return U();
        }
};
class Test1{};

int main() {
    Test t;
    Test1 t1 = (Test1)t;

    return 0;
}

https://ideone.com/XcRkTn

class Test
{
    public:
        template<typename T> 
        operator T() 
        {
            return T();
        }
};
class Test1{};

int main() {
    Test t;
    Test1 t1 = (Test1)t;

    return 0;
}

1 个答案:

答案 0 :(得分:2)

你使用这个

让编译器变得太难了
template<typename T, typename U = T> 
operator U() 
{
    return U();
}

代码说&#34; U与T&#34;的类型相同。并且编译器要求&#34;什么是T?&#34;。 T在代码中的任何位置都没有使用,因此编译器无法推断出它。

typename U = T仅适用于一种方式,以便在知道U时定义T