0

私はC++が初めてで、このオープンソースプログラム(Linux用/Linux用に開発)をコンパイルしてOS X上のxcodeで実行しようとしています.

use of undeclared identifier 'x'コードをコンパイルして実行すると、このまたはこのような多くのエラー (xcode がカウントするよりも多く) が発生します。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;

しかし、これらのエラーの膨大な数は、

  1. 変数 x を _x として宣言できる (かなり一般的な) バージョンの C++ コンパイラが存在する可能性があります。これで、ダウンロードしたソースに多くのコンパイラ エラーがある理由が説明できます。
  2. ソースの「悪いバッチ」を手に入れたのかもしれませんが、ソースがどういうわけか厄介なので、それをコンパイルするために時間を無駄にするべきではありません。

経験豊富な C++ 開発者は、何が起こっているのか説明できますか?

4

1 に答える 1

4
  • xyは基本クラスのデータ メンバーですTVector2<T>

  • T基本クラスはテンプレート パラメーターに依存する型であるため、修飾されていない名前を検索するときに検索されません。

  • MSVC がこのコードをコンパイルしていたと思いますが、C++11 モードでまだコンパイルされているかどうかはわかりません。その理由は、MSVC がテンプレートで適切に名前解決を行わなかったためです。

  • 修正は通常、this->x代わりに言うことですx

于 2013-10-03T01:01:48.030 に答える