C++ C++;使用运算符重载转换模板

C++ C++;使用运算符重载转换模板,c++,templates,C++,Templates,我有一个模板类,我试图通过操作符重载将一个模板验证转换为另一个模板验证 enum MyTypes {A,B,C} template<MyTypes T> MyClass { const static MyType type_ = T; template<MyTypes U> MyClass<U> convert(MyTypes t) { MyType<U> ret = MyType<U&

我有一个模板类,我试图通过操作符重载将一个模板验证转换为另一个模板验证

enum MyTypes {A,B,C}

template<MyTypes T>
MyClass {
    const static MyType type_ = T;
    template<MyTypes U>       
    MyClass<U> convert(MyTypes t) {
        MyType<U> ret = MyType<U>();
        ....
        return r;
    }
    template<MyTypes U>      
    MyClass<U> operator()() {
        return convert(U);
    }
}
基本上,我想要达到的是,如果我

MyClass<A> a = MyClass<A>;
MyClass<B> b = a;
MyClass a=MyClass;
MyClass b=a;
它会基于a和转换创建一个新的MyClass。知道我犯了什么错吗

编辑: 我抛出了一个模板函数,只留下了操作符

template<MyTypes U>      
MyClass<U> operator()() {
    MyClass<U> ret = MyClass<U>();
    ...
    return ret;
}
模板
MyClass运算符()(){
MyClass ret=MyClass();
...
返回ret;
}
但这仍然会带来收益

conversion from MyClass<0u> to non-scalar type MyClass<1u> requested
请求从MyClass转换为非标量类型MyClass
当你想做什么的时候

MyClass<B> = a
MyClass=a

以下内容转换值并允许赋值:

#include <iostream>
#include <string>

enum MyTypes { A, B, C };

template<MyTypes T>
struct MyClass{
    const static MyTypes type_ = T;
    std::string history{"started as " + std::to_string(T)};

    template<MyTypes U>
    operator MyClass<U> () {
        return {history+" then became " + std::to_string(U)};
    }
};

int main()
{
    MyClass<A> a;
    MyClass<B> b = a;
    MyClass<C> c = b;

    std::cout << a.history << '\n';
    std::cout << b.history << '\n';
    std::cout << c.history << '\n';
}

转换(U)
。这里的模板参数是什么?不,它不是
U
。想想看,什么是MyType?什么是
r
?你能发布一个我们可以复制粘贴并得到完全相同的错误消息吗?对不起,但是。。。使用
MyType ret=MyType()(在
convert()
)中),您的意思是
MyClass r=MyClass()?@max66。。。我想你是对的,我在那个函数中塞满了一些东西。我把它扔掉是为了避免额外的麻烦,塔特修好了。看起来我的基本错误和其他小错误是意外地重载了错误的运算符
conversion from MyClass<0u> to non-scalar type MyClass<1u> requested
MyClass<B> = a
#include <iostream>
#include <string>

enum MyTypes { A, B, C };

template<MyTypes T>
struct MyClass{
    const static MyTypes type_ = T;
    std::string history{"started as " + std::to_string(T)};

    template<MyTypes U>
    operator MyClass<U> () {
        return {history+" then became " + std::to_string(U)};
    }
};

int main()
{
    MyClass<A> a;
    MyClass<B> b = a;
    MyClass<C> c = b;

    std::cout << a.history << '\n';
    std::cout << b.history << '\n';
    std::cout << c.history << '\n';
}
started as 0
started as 0 then became 1
started as 0 then became 1 then became 2