【发布时间】:2014-10-25 16:38:03
【问题描述】:
我有两个班String 和Integer。
我希望String 能够转换为Integer 和Integer 到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:使用未定义类型“整数”
所以前向声明没有用。
我应该如何实现这个?
任何帮助将不胜感激。
【问题讨论】:
-
转发声明字符串并在字符串之前实现整数。还有为什么需要对 intTypeImpl 进行模板化?
-
如果我将 intTypeImpl 放在首位并转发声明字符串并在发生相同错误后放置字符串“错误 C2027:使用未定义类型'字符串'”。还需要模板类,因为我需要 typedef intTypeImpl
和 intTypeImpl 类型 -
我能想到的唯一解决方法是将代码拆分为 .hpp 和 .cpp 文件,以便您的标头包含类及其成员变量/函数的声明,然后在 cpp文件你实现了这些成员函数。这是我认为打破循环递归的传统方式
-
设计有问题,我会避免它。如果您遵循此路径,您将遇到太多问题,更喜欢使用命名函数进行转换。例如,假设您有两个
operator==一个带有两个String对象,另一个带有两个Integer对象,并且您尝试比较String和Integer并且突然编译器会出现一些歧义错误。 .. -
@Indika:如果我是你,我不会捕捉到
std::invalid_argument异常 - 如果使用你的代码的人给出了无效的参数,请告诉他!
标签: c++ casting operator-overloading