継承とテンプレート メソッドについて質問があります。この2つのクラスがあるとします
class Base
{
public:
template<typename T>
void print(const T& s) {std::cout << "Base (templated) prints " << s << "\n";}
virtual void print(int i) {std::cout << "Base prints " << i << "\n";}
};
class Derived : public Base
{
public:
void print(int i) {std::cout << "Derived prints " << i << "\n";}
}
int main()
{
Derived d;
d.print(3); // works fine
std::string s = "hi";
d.print(s); // does not compile
return 0;
}
コンパイラは、「Derived::print(std::string&) の呼び出しに一致する関数がありません」と通知します。しかし、Base から継承する Derived は、テンプレート メソッド print(..) の呼び出しも許可する必要があります。
派生クラスでメソッド「print」を定義しないと、すべてが正常に機能し、コンパイラは基本クラスのテンプレート メソッドを呼び出します。
基本クラスを呼び出す派生クラスでもテンプレートメソッドを定義しても問題はありませんが、それは私には正しくないようです...
ご協力いただきありがとうございます。