-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++ 模板常见问题解答:

该标准规定,模板中的非限定名称通常是不相关的,并且必须在定义模板时进行查找。由于当时不知道依赖基类的定义(可能还没有看到基类模板的特化),因此永远不会将非限定名称解析为依赖基类的成员。如果模板中的名称应该引用基类成员或间接基类,则可以通过限定它们使它们依赖,或者通过 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);

这是一个现场演示。

于 2013-06-10T22:41:08.340 回答