0

次のコードの何が問題なのか疑問に思っていました:

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

で失敗しますが、次のコードerror: no matching function for call to 'Test1::Test1(Test&)'の変換は成功します。

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;
}
4

1 に答える 1

2

あなたはこれでコンパイラにとってあまりにも難しくなっています

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

コードには、「U は T と同じ型です」と書かれています。そして、コンパイラは「T とは何ですか?」と尋ねます。Tコードのどこにも使用されていないため、コンパイラはそれを推測できません。

typename U = TUがいつT既知であるかを定義するために、一方向にのみ機能します。

于 2016-01-17T11:28:30.257 に答える