具有默认模板参数的转换运算符

Conversion operator with default template argument

我想知道 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;
}

你这样做对编译器来说太难了

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

代码显示 "U is the same type as T"。编译器询问 "And what is T?"。 T 未在您的代码中的任何地方使用,因此编译器无法推断它。

typename U = T 只有一种方法,当 T 已知时定义 U