为两个类定义重载的转换运算符,它们之间具有循环依赖关系

时间:2014-10-25 16:38:03

标签: c++ casting operator-overloading

我有两个课程StringInteger 我希望String能够投放到IntegerInteger投放到String
我使用运算符重载实现它的方式如下(注意Integer类是基于模板的)

#include <string>

class Integer; // forward declaration but doesnt fix the compiler error

class String {
public:
    operator Integer() {                                                
        try {                                               
            return std::stoi(s);
        catch(std::invalid_argument ex) {                                           

        }                                               
    }
    std::wstring s;
};

template<class T>
    class intTypeImpl {
    T value;
public:
    typedef T value_type;
    intTypeImpl() :value() {}
    intTypeImpl(T v) :value(v) {}
    operator T() const {return value;}

    operator String() {         
        return std::to_wstring(value);                                      
    }
};

typedef intTypeImpl<int> Integer;

编译器正在发布

  

错误C2027:使用未定义的类型&#39;整数&#39;

所以前瞻声明是没用的 我该如何实现呢?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

Casting运算符重载了外部类:

/* after every line of code you posted */
operator Integer(const String& str){
    return std::stoi(str.s);
}

intTypeImpl中投射c-tor:

#include <type_traits>

/* in intTypeImpl */
intTypeImpl()=default;
intTypeImpl(const intTypeImpl<T>&)=default;

intTypeTmlp(String& str){
    static_assert(
        std::is_same<T, int>,
        "String can be converted only to intTypeImpl<int>"
    );
    value=std::stoi(str.s);
}