我为我的应用程序定义了三个类:int2_
(整数对),float2_
(浮点数对)和double2_
(双精度对偶),基本上用于复杂算术运算。
我想在上述三个类的对象之间重载赋值=
运算符。我的动机是编写CUDA代码,但似乎没有为CUDA类int2
,float2
和double2
定义赋值运算符。
我目前的实施如下:
class int2_ {
public:
int x;
int y;
int2_() : x(), y() {}
// Stuff
const int2_& operator=(const float2_ a) { int2_ b; b.x = (int)a.x; b.y = (int)a.y; return b; }
const int2_& operator=(const double2_ a) { int2_ b; b.x = (int)a.x; b.y = (int)a.y; return b; }
};
class float2_ {
public:
float x;
float y;
float2_() : x(), y() {}
// Stuff
const float2_& operator=(const double2_ a) { float2_ b; b.x = (float)a.x; b.y = (float)a.y; return b; }
};
class double2_ {
public:
double x;
double y;
double2_() : x(), y() {}
// Stuff
};
所有内容都归纳为 stuff 不提供编译错误。剩余的运算符重载会返回以下错误
error : identifier "float2_" is undefined
error : identifier "double2_" is undefined
error : identifier "double2_" is undefined
分别针对三种不同的重载。
似乎存在“可见性”问题,因为例如float2_
和double2_
尚未在int2_
类定义之前定义。关于如何解决问题的任何建议?非常感谢你提前。
解决James KANZE和ALEXRIDER的答案后的解决方案
以下是解决方案:
class int2_;
class float2_;
class double2_;
class int2_ {
public:
int x;
int y;
int2_() : x(), y() {}
inline const int2_& operator=(const int a) { x = a; y = 0.; return *this; }
inline const int2_& operator=(const float a) { x = (int)a; y = 0.; return *this; }
inline const int2_& operator=(const double a) { x = (int)a; y = 0.; return *this; }
inline const int2_& operator=(const int2_ a) { x = a.x; y = a.y; return *this; }
inline const int2_& operator=(const float2_ a);
inline const int2_& operator=(const double2_ a);
};
class float2_ {
public:
float x;
float y;
float2_() : x(), y() {}
inline const float2_& operator=(const int a) { x = (float)a; y = 0.; return *this; }
inline const float2_& operator=(const float a) { x = a; y = 0.; return *this; }
inline const float2_& operator=(const double a) { x = (float)a; y = 0.; return *this; }
inline const float2_& operator=(const int2_ a) { x = (float)a.x; y = (float)a.y; return *this; }
inline const float2_& operator=(const float2_ a) { x = a.x; y = a.y; return *this; }
inline const float2_& operator=(const double2_ a);
};
class double2_ {
public:
double x;
double y;
double2_() : x(), y() {}
inline const double2_& operator=(const int a) { x = (double)a; y = 0.; return *this; }
inline const double2_& operator=(const float a) { x = (double)a; y = 0.; return *this; }
inline const double2_& operator=(const double a) { x = a; y = 0.; return *this; }
inline const double2_& operator=(const int2_ a) { x = (double)a.x; y = (double)a.y;return *this; }
inline const double2_& operator=(const float2_ a) { x = (double)a.x; y = (double)a.y;return *this; }
inline const double2_& operator=(const double2_ a) { x = a.x; y = a.y; return *this; }
};
inline const int2_& int2_::operator=(const float2_ a) { x = (int)a.x; y = (int)a.y; return *this; }
inline const int2_& int2_::operator=(const double2_ a) { x = (int)a.x; y = (int)a.y; return *this; }
inline const float2_& float2_::operator=(const double2_ a) { x = (float)a.x; y = (float)a.y; return *this; }
答案 0 :(得分:2)
首先,您需要使用类的前向声明:
class Int2;
class Float2;
class Double2;
然后,在类中,您应该只声明函数,而不是 实施它们。实施应该在所有之后 类定义,在单独的源文件中,或 明确声明内联。
答案 1 :(得分:1)
您需要更改类声明的顺序如下 在这种情况下,前向声明将无济于事,因为您需要声明要在operator =
中使用的类型class double2_ {
public:
double x;
double y;
double2_() : x(), y() {}
// Stuff
};
class float2_ {
public:
float x;
float y;
float2_() : x(), y() {}
// Stuff
const float2_& operator=(const double2_ a) { float2_ b; b.x = (float)a.x; b.y = (float)a.y; return b; }
};
class int2_ {
public:
int x;
int y;
int2_() : x(), y() {}
// Stuff
const int2_& operator=(const float2_ a) { int2_ b; b.x = (int)a.x; b.y = (int)a.y; return b; }
const int2_& operator=(const double2_ a) { int2_ b; b.x = (int)a.x; b.y = (int)a.y; return b; }
};
还有operator =本身的问题,它应该返回* this;而不是在操作员=完成工作后将立即超出范围的b。
答案 2 :(得分:0)
问题是float2_
仅在int2_
之后定义,它已被使用。
添加这两个类的前向声明,你应该没问题:
class int2_;
class double2_;