ニースのコンパイルエラー。このタイプのチェックでは、標準に戻ってチェックする前に、必ずComeauコンパイラにフォールバックします。
Comeau C/C++ 4.3.10.1 (2008 年 10 月 6 日 11:28:09) ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. 全著作権所有。MODE:厳密なエラー C++ C++0x_extensions
"ComeauTest.c"、3 行目: エラー: "virtual" は関数テンプレート宣言テンプレートでは許可されていません virtual void f(); ^
"ComeauTest.c"、10 行目: エラー: "virtual" は関数テンプレート宣言テンプレートでは許可されていません virtual void f(); ^
現在、別のユーザーによって投稿されているように、実際には、標準では仮想テンプレート メソッドを定義することはできません。その根拠は、すべての仮想メソッドについて、vtable でエントリを予約する必要があるということです。問題は、テンプレート メソッドがインスタンス化 (使用) された場合にのみ定義されることです。これは、異なるタイプのf()への異なる呼び出しがいくつ発生するかに応じて、vtable が各コンパイル単位に異なる数の要素を持つことになることを意味します。それから地獄が上がるだろう...
引数の 1 つにテンプレート化された関数が必要で、1 つの特定のバージョンが仮想である場合 (引数の一部に注意してください)、次のように実行できます。
class Base
{
public:
template <typename T> void f( T a ) {}
virtual void f( int a ) { std::cout << "base" << std::endl; }
};
class Derived : public Base
{
public:
virtual void f( int a ) { std::cout << "derived" << std::endl; }
};
int main()
{
Derived d;
Base& b = d;
b.f( 5 ); // The compiler will prefer the non-templated method and print "derived"
}
これを任意のタイプに一般化したい場合は、運が悪いです。ポリモーフィズムではなく、別の種類の委任を検討してください (集約 + 委任が解決策になる可能性があります)。当面の問題に関する詳細情報は、解決策を決定するのに役立ちます。