2017-10-06 57 views
0

我有一个模板类,我尝试通过运算符重载为模板verision转换为另一种C++与运算符重载转换模板

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

然而,这种收益率(海合会,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; 

它创建基于一个和转换一个新的MyClass的。任何想法这里我的错误是什么?

编辑: 我抛出了一个模板功能,只需留下操作

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

而是试图做

MyClass<B> = a 
+0

'转换(U)'。这里的模板参数是什么?不,这不是'U'。想想看。 –

+1

什么是MyType?什么是'r'?你可以发布[mcve]我们可以复制和粘贴并获得完全相同的错误信息吗? – aschepler

+0

对不起,但是......用'MyType ret = MyType ();'(在'convert()'内部),你的意思是'MyClass r = MyClass ();'? – max66

回答

1

下转换时,这仍然产生

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

该值并允许分配:

#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 
+0

谢谢,修复它。看起来像其他小项目中的我的基本错误是意外地超载了错误的操作符 – chrise