1
template<typename T1, typename T2, typename T3>
class A: public A<T1, T2, void> {
public:
    T1 a;
    T2 b;
    T3 c;

    void set() { a = aa; } // Cannot find variable `aa' here!
};

template<typename T1, typename T2>
class A<T1, T2, void> {
public:
    T1 aa;
    T2 bb;
};

上記のように、テンプレート クラスAとその部分的な特殊化されたフォーム がありA'ます。では、A が A' から継承することは可能ですか? g++ によると、問題ないようです。しかし、A' のメンバーにアクセスしようとすると、g++ が不平を言い始めました:そのシンボルが見つかりません。理由を知っている人はいますか?

4

2 に答える 2

0

C++ テンプレートでの名前検索規則は、少し直感的ではないように見えるかもしれません。コンパイラは、最初にテンプレート定義を解析するときに、テンプレート引数に依存しないすべての名前を解決します。テンプレートのインスタンス化に関しては、残りを解決します。

クラス Aの定義だけを見ると、シンボルaaが型引数 T1、T2、または T3 に明確に依存していません。そのため、コンパイラは名前を解決しようとしますが、その名前はその環境では定義されていないため、解決できません。

そのため、コンパイラに希望どおりの動作をさせるには、以下のトリックを使用する必要があります。

  • 最も簡単なのはおそらくthis->aaです。これにはテンプレート引数に依存するスーパークラスがあるためそのメンバーはテンプレートのインスタンス化時にのみ検索できるため、すべて問題ありません。

  • メンバーをスーパークラスで修飾します。つまり、A<T1, T2, void>::aa を使用します。これにより、依存関係が非常に明確になります。毎回これを入力する必要がないように、 usingディレクティブを使用することもできます。

于 2013-07-14T06:40:14.907 に答える