2

テンプレート パラメータに基づいてテンプレートをオーバーロードできることはわかっています。

template <class T> void test() {
    std::cout << "template<T>" << std::endl;
}
void test() {
    std::cout << "not a template" << std::endl;
}

次に、いくつかの関数内で:

test<int>();
test();

2 つの異なるバージョンの test() のどちらが必要かを正しく解決します。ただし、継承を使用してクラス内でこれを行うと、次のようになります。

class A {
public:
    void test() {
       std::cout << "A::Test: not a template" << std::endl;
    }
};
class B : public A {
public:
    template <class T>
    void test() {
       std::cout << "B::Test: template<T>" << std::endl;
    }
};

次に、関数内で:

B b;
b.test<int>();
b.test();

b.test<int>();機能しますが、b.test();機能しません:

error: no matching function for call to ‘B::test()’
note: candidate is:
note: template<class T> void B::test()

これはなぜですか / テンプレート引数に基づいて 2 つのバージョンを正しく解決する方法はありますか?

4

2 に答える 2

2

いつものように、派生クラスで定義された名前は、基本クラスでの同じ名前の使用を隠します。基本クラスの名前を派生クラスにホイストするには、追加します

using A::test;

派生クラスに。

于 2012-08-27T17:52:45.887 に答える
0

あなたが観察していることは、名前の隠蔽と呼ばれます。派生クラスの名前は、基本クラスにtest隠されます。そのオブジェクトの正確なタイプを介して呼び出されたときに name が見つからtestないという宣言がなければ (base にキャストするか、呼び出しを明示的に修飾することも役立ちます)。using

于 2012-08-27T17:57:30.930 に答える