我是C ++的新手,并试图获得this开源程序(在linux中开发)以在OS X上编译和运行xcode。
当我编译并运行代码时,我得到了很多错误(比xcode更愿意计算),例如use of undeclared identifier 'x'
或use of undeclared identifier 'y'
以下是抛出错误的代码示例:
template<typename T>
struct TVector2 {
T x, y;
TVector2(T _x = 0.0, T _y = 0.0)
: x(_x), y(_y)
{}
double Length() const {
return sqrt(static_cast<double>(x*x + y*y));
}
double Norm();
TVector2<T>& operator*=(T f) {
x *= f;
y *= f;
return *this;
}
TVector2<T>& operator+=(const TVector2<T>& v) {
x += v.x;
y += v.y;
return *this;
}
TVector2<T>& operator-=(const TVector2<T>& v) {
x -= v.x;
y -= v.y;
return *this;
}
};
struct TVector3 : public TVector2<T> {
T z;
TVector3(T _x = 0.0, T _y = 0.0, T _z = 0.0)
: TVector2<T>(_x, _y), z(_z)
{}
double Length() const {
return sqrt(static_cast<double>(x*x + y*y + z*z)); //use of undeclared identifier x
}
double Norm();
TVector3<T>& operator*=(T f) {
x *= f;
y *= f;
z *= f;
return *this;
}
作为一个没有经验的C ++程序员,我看起来像x和y只是未声明的局部变量。我可以通过简单地声明变量来让编译器摆脱错误,就像这样...
struct TVector3 : public TVector2<T> {
T z;
T x;
T y;
然而,这些错误的绝对数量让我想到了
有经验的C ++开发人员可以解释可能发生的事情吗?
答案 0 :(得分:4)
x
和y
是基类TVector2<T>
的数据成员。
由于基类是依赖于模板参数T
的类型,因此在查找不合格的名称时,不搜索。
我相信MSVC用于编译此代码,不确定它是否仍然在C ++ 11模式下。原因是MSVC没有在模板中正确地进行名称解析。
修复通常是this->x
代替x
。