テンプレート パラメータに基づいてテンプレートをオーバーロードできることはわかっています。
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 つのバージョンを正しく解決する方法はありますか?