次のコードの長いリストで、3 つの場所を探してください。
// "this->" can be omitted before first data[0]
と
// Compile error, if "this->" is omitted before first data[0]
と
// 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
ため、従属名です。T
T
私はまだ答えを待っています。