関数テンプレートの特殊仮想法的を作っていますか?
-
09-09-2019 - |
質問
C ++では、関数テンプレートの特殊化は、まさに通常の関数のように行動することになっています。それは私が1を仮想作ることができることを意味するのでしょうか?
例
struct A
{
template <class T> void f();
template <> virtual void f<int>() {}
};
struct B : A
{
template <class T> void f();
template <> virtual void f<int>() {}
};
int main(int argc, char* argv[])
{
B b;
A& a = b;
a.f<int>();
}
Visual Studio 2005ののは私に次のエラーを与えます:
致命的なエラーC1001:内部エラーがコンパイラで発生している。
。
解決
ニースコンパイラエラー。チェックのこのタイプのために私は常に標準に戻って行くとチェックする前にコモのコンパイラにフォールバックします。
それは他のユーザーによって投稿されているように、コモC / C ++ 4.3.10.1(2008年10月6日 ONLINE_EVALUATION_BETA2のため午前11時28分09秒) 著作権1988-2008コモーコンピューティング。 全著作権所有。 MODE:厳格 エラーC ++ C ++ 0x_extensions
"ComeauTest.c"、3行目:エラー: 「仮想」機能では使用できません テンプレート 宣言 テンプレート仮想ボイドF(); ^
"ComeauTest.c"、10行目:エラー: 「仮想」機能では使用できません テンプレート 宣言 テンプレート仮想ボイドF(); ^
さて、実際には、標準を使用して、仮想テンプレートメソッドを定義することができないということです。根拠は、すべての仮想メソッドのために、エントリがvtableの中に予約しなければならないということです。問題は、テンプレートメソッドは、彼らだけがインスタンス化されているとき(使用)に定義されるということです。これは、vtableの異なるタイプが起こると F()にどのように多くの異なった呼び出しに応じて、各コンパイル単位の要素の異なる数を有する終わることを意味します。そして、地獄を上げることでしょう...
あなたが欲しいのは、あなたがそれを行うことができます(引数の一部に注意してください)引数の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"
}
あなたはどんなタイプのため、これは一般化したい場合は、、あなたは運外です。 (凝集+委任は、溶液であってもよい)の代わりに多型の代表団の別のタイプを考えます。当面の問題の詳細については、ソリューションを決定する際に役立つだろう。
他のヒント
http://www.kuzbass.ru:8086/docsによると、 /isocpp/template.html のISO / IEC 14882:1998:
-3-メンバ関数テンプレートは仮想であってはなりません。
例:
template <class T> struct AA {
template <class C> virtual void g(C); // Error
virtual void f(); // OK
};
virtual
宣言することはできませんので、、これは法律上のコードではありません。
しかし、さえのVisual Studio 2012はこれにチョーク: のフルサイズはこちらをクリックしてください。のの
イベントログは、コンパイラが0xC0000005
、またはSTATUS_ACCESS_VIOLATION
に墜落したことを示しています。これは、特定の(違法な)コード構築物は、コンパイラのセグメンテーションフォルトを作ることができるかおかしい...