没有用于调用 CopyConstructor 的匹配函数

no matching function for call to CopyConstructor

本文关键字:函数 CopyConstructor 用于 调用      更新时间:2023-10-16

there.我有类似于下面的代码。

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缺少一个副本构造器,而我通过传递其成员值来初始化结构。此外,我确实有一个复制构造函数。

如何解决问题?

来自C++模板常见问题解答:

该标准规定,模板中的非限定名称通常是非依赖性的,必须在定义模板时查找。由于当时不知道依赖基类的定义(可能存在尚未看到的基类模板的专用化(,因此永远不会将非限定名称解析为依赖基类的成员。如果模板中的名称应该引用基类成员或间接基类,则可以通过限定它们来使它们成为依赖关系,也可以使用 using-声明将其引入模板的范围。

溶液:

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

但这会导致另一个问题,因为您调用了此构造函数:

BaseStruct(kType& key, tType& element);

有了这些参数:

DerivedStruct(0, SomeClass());

但是,非常量引用无法绑定到临时值,因此这会导致不匹配的函数调用错误。

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

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

这是一个现场演示。