C++转换具有运算符重载的模板

C++ converting templates with operator overload

本文关键字:重载 运算符 转换 C++      更新时间:2023-10-16

我有一个模板类,我尝试通过运算符重载将模板版本转换为另一个模板验证

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

但是,这会产生(在 gcc,c11 上)

conversion from MyClass<0u> to non-scalar type MyClass<1u> requested

删除模板函数并尝试

MyClass<A> operator()() {
    MyClass<A> a = MyClass<A>();
    ...
    return a;
}

抛出

the error operator cannot be overloaded

基本上,我想要实现的是,如果我有

MyClass<A> a = MyClass<A>;
MyClass<B> b = a;

它基于 a 和转换创建一个新的 MyClass。知道我在这里的错误是什么吗?

编辑:我扔掉了一个模板函数,只是留下了运算符

template<MyTypes U>      
MyClass<U> operator()() {
    MyClass<U> ret = MyClass<U>();
    ...
    return ret;
}

但这仍然产生

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