C++ 对CopyConstructor的调用没有匹配的函数

C++ 对CopyConstructor的调用没有匹配的函数,c++,class,constructor,copy-constructor,C++,Class,Constructor,Copy Constructor,在那里。我有类似于下面的代码 struct SomeClass { SomeClass(); }; SomeClass::SomeClass() {} template <class K, class T> struct BaseStruct { typedef K kType; typedef T tType; kType _key; tType _element; BaseStruct();

在那里。我有类似于下面的代码

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());
}
基本上,我是说sctuct缺少一个副本构造函数,而我是通过传递其成员值来对结构进行序列化。 此外,我有一个复制构造函数


<如何解决问题?

从C++模板常见问题:

该标准规定,模板中的非限定名称通常是非依赖的,必须在定义模板时查找。由于当时不知道依赖基类的定义(可能还没有看到基类模板的专门化),因此决不会将非限定名称解析为依赖基类的成员。如果模板中的名称应该引用基类成员或间接基类,则可以通过限定它们使它们成为从属的,或者通过使用声明将它们引入模板的范围

解决方案:

struct DerivedStruct : public BaseStruct<int, SomeClass>
{
    using BaseStruct::BaseStruct;
};
有了这些论点:

DerivedStruct(0, SomeClass());
但是非常量引用不能绑定到临时值,因此这会导致不匹配的函数调用错误

尝试通过常量引用传递参数,以便它可以接受右值,而不仅仅是左值:

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

当您调用
DerivedStruct(0,SomeClass())
时,您期望得到什么?@LuchianGrigore基本上我正在对一个没有回答我问题的DerivedStruct实例进行序列化。您希望该代码段调用哪个构造函数?构造函数没有名称,而使用声明的
使用的是C++11“继承构造函数”功能,这类似于仅为
DerivedStruct
声明和定义许多构造函数,这不仅仅是一种调用同一函数的新方法。请注意,问题与名称查找无关。默认情况下不会继承构造函数。在C++03中,您必须显式定义一个
DerivedStruct
ctor,或者在您的答案中使用C++11解决方案。@JesseGood既然我的解决方案有效,那么实际的解释是什么呢?谢谢。我试过你的建议。我得到了没有使用模板参数的'template struct BaseStruct'。我尝试添加模板参数,得到了一个使用BaseStruct::BaseStruct'names构造函数的隐式表达式。我怎样才能解决这个问题?@geraldCelente哦,你的编译器没有使用新标准(C++11)。尝试添加
-std=c++11
标志
DerivedStruct(0, SomeClass());
BaseStruct(kType const& key, tType const& element);