4

次のコードの長いリストで、3 つの場所を探してください。

  1. // "this->" can be omitted before first data[0]

  1. // Compile error, if "this->" is omitted before first data[0]

  1. // likewise, "this->" is required.

「this->」を省略できる場合と省略できない場合がある理由がわかりません。

コンパイル エラー: main.cpp:19:3: エラー: 'data' はこのスコープで宣言されていませんでした

それは単なるコンパイラのバグですか?私のコンパイラは GCC v4.8.1 と v4.8.2 です。ありがとう。ところで、QtCreator のデフォルトの intelli-sense は、実際には、3 つの場所すべてで「this->」なしで「data[0]」を認識できます。

コードリストは次のとおりです。

template <typename T>
struct Vec3_
{
    T data[3];
    inline Vec3_<T> & operator =(const Vec3_<T> & rhs) {
        if (this != &rhs) {
            data[0] = rhs.data[0];  // "this->" can be omitted before first data[0]
            data[1] = rhs.data[1];
            data[2] = rhs.data[2];
        }
        return *this;
    }
};

template <typename T>
struct Vec3i_: Vec3_<T>
{
    inline Vec3i_<T> & operator ^=(const Vec3i_<T> & rhs) {
        data[0] ^= rhs.data[0];     // Compile error, if "this->" is omitted before first data[0]
        this->data[1] ^= rhs.data[1];
        this->data[2] ^= rhs.data[2];
        return *this;
    }
    inline Vec3i_<T> operator ^(const Vec3i_<T> & rhs) const {
        Vec3i_<T> tmp;
        tmp[0] = this->data[0] ^ rhs.data[0];  // likewise, "this->" is required.
        tmp[1] = this->data[1] ^ rhs.data[1];
        tmp[2] = this->data[2] ^ rhs.data[2];
        return tmp;
    }
};

Vec3i_<int> A;

int main(int, char**) { return 0; }

==更新==

誰かが非常によく似た質問(おそらく重複している可能性があります)と回答を指摘しており、その質問のタイトルは説明的でさえあるので、私はそのタイトルに似たタイトルを変更しました(パラメーター依存関係の違いを除く)

しかし、その質問に対する回答を読んだ後でも、私はまだ混乱しています。回答は、変数が非依存の名前である場合、コンパイラは基本テンプレート クラスで名前を検索しないというFAQ [ここにリンク]を示しています。ただし、この例では、変数 ( ) はタイプが であり、テンプレート変数であるdataため、従属名です。TT

私はまだ答えを待っています。

4

0 に答える 0