8

次のコードでコンパイル エラーが発生しています。

template <typename T>
class Base
{
    public:
    void bar(){};
};

template <typename T>
class Derived : public Base<T>
{
    public:
    void foo() { bar(); }   //Error
};

int main()
{
    Derived *b = new Derived;
    b->foo();
}

エラー

Line 12: error: there are no arguments to 'bar' that depend on a template parameter, so a declaration of 'bar' must be available

このエラーが発生するのはなぜですか?

4

2 に答える 2

14

この名前は、のテンプレート パラメータのfoo()いずれにも依存しません。依存しない名前です。一方、が見つかった基本クラスは、のテンプレート パラメータ (つまり、)の1 つに依存するため、依存する基本クラスです。C++ は、非依存の名前を検索するときに、依存する基底クラスを検索しません。Derivedfoo()Base<T>DerivedT

bar()これを解決するには、 inへの呼び出しをまたはDerived::foo()として修飾する必要があります。this->bar()Base<T>::bar()

この C++ FAQ 項目はそれをうまく説明しています: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19を参照してください。

于 2012-04-25T08:28:20.110 に答える
0

あなたが提供したコードには、指定した行にビルド エラーはありません。それはここにあります:

Derived *b = new Derived;

これは次のようになります。

Derived<int> *b = new Derived<int>();

(または int の代わりに任意の型を使用します。)

于 2012-04-25T08:31:26.093 に答える