1

A級があります

template <typename T>
class A
{
public:  virtual T get() = 0;
};

および 2 つの派生クラス B、C および get() メソッド

template <typename T>
class B : public A<T>
{
private: T b;
public:  T get() {return b;}
};

template <typename T>
struct Test
{
T data; typedef T Type;
};

データメンバーとして使用される一般的なオブジェクトを返すことができるように get() を設計する方法は? データ型 Test をテンプレート化しようとしました

template <typename Data>
class C : public B <typename Data::Type>
{
private: Data c;

public: virtual Data get() {return c;}
};

int main(int argc, char* argv[])
{
C <Test<double>> *c = new C<Test<double>> ();
c->get();
}

しかし、この例はまだ機能しません。次のメッセージが表示されます。

Error   1   error C2555: 'C<Data>::get':
overriding virtual function return type differs and 
is not covariant from 'B<T>::get()

コードを修正するには?ご協力いただきありがとうございます...

クラス階層は、エラー処理の非常に単純化された例を表しています。派生クラスのすべての get() メソッドがエラー オブジェクトを返しています: 変数、ベクトル、行列など...

たとえば、クラス B は変数を表し、クラス C は行列を表します。

更新された質問:

申し訳ありませんが、同時に多くのことを行っています...認識できませんでした

template <typename Data>
class C : public B <typename Data::Type>
{

A、B の戻り値の型を double に設定し、C も double を返さなければなりません。正しいバージョンは

template <typename Data>
class C : public A <Data>
{
private: Data c;

public: virtual Data get() {return c;}
};
4

1 に答える 1

2

あなたが何をしようとしているのか完全にはわかりませんが、これは少なくともコンパイルされます:

template <typename Data>
class C : public B <typename Data::Type>
{
    private: typename Data::Type c;

    public: virtual typename Data::Type get() {return c;}
};

あなたのコードでは、次のエラーが発生しました。

prog.cpp: In instantiation of ‘class C<Test<double> >’:
prog.cpp:30:44:   required from here
prog.cpp:25:22: error: conflicting return type specified for ‘Data C<Data>::get()
    [with Data = Test<double>]’
prog.cpp:11:12: error:   overriding ‘T B<T>::get() [with T = double]’

つまり、(これは ) でインスタンス化するためBData::Type(これはdouble)だけでなく、 get()inCも返す必要があります。Data::TypeDataTest<double>

于 2013-05-06T20:34:22.597 に答える