-1

編集: これは、「愚かで面白くない間違い」の別のケースです。あなたは警告されました:)

ここに、私を夜更かしさせているものがあります。C++ の知識が豊富な人なら、これを機能させる方法を見つけることができるかもしれません。

template<class T>
class Base
{
    virtual void Method ( T* arg ) = 0;
};

class Child : public Base<MyType>
{
    void Method ( MyType* arg ) { /*blah*/ };
};

2 つのメソッドを一緒に一致させることができないため、これはコンパイルされません (少なくとも VS2008 ではコンパイルされません)。

現在、メソッド宣言で MyType の代わりに BaseType を使用して回避し、メソッドの Child 実装で BaseType を MyType にキャストします (基本クラス内の他の要素のテンプレートとして MyType が必要です)。

それでも、テンプレート化された型を直接使用できると便利です。

編集: 他のエラー (後でリストされたもの) を修正すると、すべてが機能したようです。template<class T>元のコードの代わりにtemplate<T>、メソッドがパブリックとしてリストされていました。投稿する前にもっと待つべきだったことを示しています。申し訳ありません。

4

4 に答える 4

4

コンパイルして正常に動作する完全な例を次に示します。

struct MyType
{
};

template< class T>
class Base
{
public:
    virtual void Method ( T* arg ) = 0;
};

class Child : public Base<MyType>
{
  public:
    void Method ( MyType*  ) { /*blah*/ };
};


int main()
{
  MyType a;
  Child b;

  b.Method( &a );
}
于 2012-09-10T06:38:34.493 に答える
2

最初のクラス テンプレートで正しい構文が必要です。

template<typename T> // here! You can also use "class" instead of "typename".
class Base
{
    virtual void Method ( T* arg ) = 0;
};

タイプでない限り、2番目のクラスはクラステンプレートでなければなりませんMyType

template <typename MyType>
class Child : public Base<MyType>
{
    void Method ( MyType* arg ) { /*blah*/ };
};
于 2012-09-10T06:43:43.847 に答える
1

template<class T>最初の行に。の代わりに書き込みますtemplate<T>。それで終わりです。

于 2012-09-10T06:39:35.603 に答える
1

望ましい結果を得るには、基本クラスのメソッドを公開する必要があります

   template<class T> class Base
    {
        public: // public definition is important or else it won't be overridden
        virtual void Method ( T* arg ) {
            cout << "Method in base.";
        }
    };

class Child : public Base<char>
{
    void Method ( char* arg ) {
       cout << "Method in child.";
    };
};
于 2012-09-10T06:52:52.383 に答える