-10

我在尝试使用以下代码std::pair在, 中插入 a 时遇到问题:std::vector

template <class R>
class AVectorContainner
{
public:
  AVectorContainner()
       {
         mVector= new std::vector<entry>;
       }
  typedef std::pair<int ,R *> entry;

  void insert(R* aPointer, int aID)
  {
     entry aEntry;
     aEntry=std::make_pair(aID,aPointer );
     mVector->push_back(aEntry);

  }
private: 
  std::vector<entry> * mVector;
}

这是主文件的一部分,我声明了一个类的指针,然后在模板类的初始化中使用它。

在 main.cpp 中:

    int main()
    {
        SomeType * aTipe= new SomeType;
        int aID=1;
        AVectorContainer<SomeType> * aContainer= new AVectorContainer;
        aContainer->insert(aTipe,aId);//error line
delete aTipe;
delete aContainer;
        return 0;
    }

编译器输出:

error: non-static reference member 'const int& std::pair<const int&, SomeType *>::first', can't use default assignment operator

error: value-initialization of reference type 'const int&'
4

3 回答 3

2

修正了所有的错别字,比较两者……他确实喜欢 20 行中的 100 个!

#include <vector>
#include <utility>

template <class R>
class AVectorContainer
{
public:
  AVectorContainer()
       {
         mVector= new std::vector<entry>;
       }
  typedef std::pair<int ,R *> entry;

  void insert(R* aPointer, int aID)
  {
     entry aEntry;
     aEntry=std::make_pair(aID,aPointer );
     mVector->push_back(aEntry);

  }
private: 
  std::vector<entry> * mVector;
};

class SomeType
{
public:
    SomeType(){ x=5; }
    ~SomeType(){ }
    int x;
};

int main()
{
    SomeType * aTipe= new SomeType;
    int aID=1;
    AVectorContainer<SomeType> * aContainer= new AVectorContainer<SomeType>;
    aContainer->insert(aTipe,aID);//error line
    return 0;
}
于 2013-08-15T19:04:15.490 回答
2

原始海报未能实际发布导致问题的代码。

从那以后,他用正确的代码编辑了我的帖子,证明了这个问题。演示问题的代码如下:

template <class R, typename B=int>
class AVectorContainer
{
public:
  AVectorContainer() {}
  typedef R* ptr_Type;
  typedef const B & const_ref_Type;
  typedef std::pair<const_ref_Type ,ptr_Type> entry;


  void insert(ptr_Type aPointer, const_ref_Type aID) {
     entry aEntry=std::make_pair(aID,aPointer);
     mVector.push_back(aEntry);
  }
private:
  std::vector<entry> mVector;
};

class SomeType
{
public:
  SomeType(){ x=5; }
  ~SomeType(){ }
  int x;
};

int main()
{
  SomeType * aTipe= new SomeType;
  int aID=1;
  AVectorContainer<SomeType> aContainer;
  aContainer.insert(aTipe,aID);
  return 0;
}

编译器输出:

/usr/include/c++/4.7/bits/stl_pair.h:88: error: non-static reference member 'const int& std::pair<const int&, SomeType*>::first', can't use default assignment operator

缺陷在于以下几行:

  typedef R* ptr_Type;
  typedef const B & const_ref_Type;
  typedef std::pair<const_ref_Type ,ptr_Type> entry;
  std::vector<entry> mVector;

在这里,原始发布者尝试制作一个包含常量引用的 a vectorof pairs,然后执行以下操作:

entry aEntry;
aEntry=std::make_pair(aID,aPointer )

这试图将一对分配给另一对。但是const&变量不能赋值给另一个变量——它们可以从另一个构造(初始化)const&,但不能赋值。

一个简单的解决方法是:

entry aEntry=std::make_pair(aID,aPointer )

这样我们就不会aEntry从另一个构造entry,而不是默认构造aEntry(这也是非法的:const&必须初始化),然后分配给它。

于 2013-08-15T19:19:55.480 回答
0

修复所有错字(Containner, aId, missing;等)后,代码编译得很好。

于 2013-08-15T19:01:33.847 回答