質問

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はこれにチョーク: C ++のVisual Studio 2012の内部コンパイラエラー のフルサイズはこちらをクリックしてください。

イベントログは、コンパイラが0xC0000005、またはSTATUS_ACCESS_VIOLATIONに墜落したことを示しています。これは、特定の(違法な)コード構築物は、コンパイラのセグメンテーションフォルトを作ることができるかおかしい...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top