次のコードを検討してください。 Derived<int>::foo()
がインスタンス化されることが保証されていますか? foo()
は仮想であり、基本クラスの非仮想関数によって呼び出されます。テンプレートクラスの仮想関数が暗黙的にインスタンス化されていますか?
#include <iostream>
class Base
{
public:
void bar() { foo(); }
private:
virtual void foo() = 0;
};
template <typename T> class Derived: public Base
{
public:
Derived(T t_) : t(t_) {}
private:
void foo() override { std::cout << t; }
T t;
};
Derived<int> make_obj()
{
return Derived<int>(7);
}
ここで私の足を考える。テンプレートインスタンス化エンジンは、どの仮想関数が使用され、どの仮想関数が使用されていないのかを知る方法がありません。安全であるためには、すべての 'virtual'関数をインスタンス化する必要があります。 –