-1

そこの。以下のようなコードがあります。

struct SomeClass
{
 SomeClass();
};

SomeClass::SomeClass()
{}




template <class K, class T>
struct BaseStruct
{ 
       typedef K kType;
       typedef T tType; 

       kType _key;
       tType _element;

       BaseStruct();       
       BaseStruct(kType& key, tType& element);
       BaseStruct(BaseStruct&);
};


       template <class K,class T>
       BaseStruct<K,T>::BaseStruct()
       {}

       template <class K,class T>
       BaseStruct<K,T>::BaseStruct(kType& key, tType& element)
       { 
         _key=key;
         _element=element;
       }

       template <class K,class T>
       BaseStruct<K,T>::BaseStruct(BaseStruct& BaseStructInstance)
       { 
         _key=BaseStructInstance._key;
         _element=BaseStructInstance._element;
       }

struct DerivedStruct:public BaseStruct<int, SomeClass>
{
};


int main(int argc, char *argv[])
{
    DerivedStruct derivedStructInstance;

    derivedStructInstance=DerivedStruct(0,SomeClass());
}

コンパイルすると、次のエラーが発生します。

In function `int main(int, char**)': 
54 no matching function for call to `DerivedStruct::DerivedStruct(int, SomeClass)' 
52 candidates are: DerivedStruct::DerivedStruct() 
52                 DerivedStruct::DerivedStruct(DerivedStruct&) 
Makefile.win [Build Error]  [main.o] Error 1 

基本的に、sctuct にはコピー コンストラクターがないと言っていますが、メンバー値を渡して構造体を初期化しています。さらに、コピーコンストラクターがあります。

どうすれば問題を解決できますか?

4

1 に答える 1

1

C++ テンプレート FAQ から:

標準では、テンプレート内の修飾されていない名前は一般に非依存であり、テンプレートを定義するときに検索する必要があると述べています。依存する基本クラスの定義はその時点では不明であるため (まだ確認されていない基本クラス テンプレートの特殊化がある可能性があります)、修飾されていない名前が依存する基本クラスのメンバーに解決されることはありません。テンプレート内の名前が基本クラスのメンバーまたは間接基本クラスを参照することになっている場合、それらを修飾して依存させるか、using 宣言でテンプレートのスコープに入れることができます。

解決:

struct DerivedStruct : public BaseStruct<int, SomeClass>
{
    using BaseStruct::BaseStruct;
};

ただし、このコンストラクターを呼び出したため、別の問題が発生します。

BaseStruct(kType& key, tType& element);

これらの引数で:

DerivedStruct(0, SomeClass());

ただし、非 const 参照は一時的な値にバインドできないため、一致しない関数呼び出しエラーが発生します。

左辺値だけでなく右辺値を受け入れることができるように、引数を定数参照で渡してみてください。

BaseStruct(kType const& key, tType const& element);

これがライブデモです。

于 2013-06-10T22:41:08.340 に答える