std :: vector插入std :: pair

时间:2013-08-15 18:48:53

标签: c++ templates stl stdvector std-pair

我在尝试使用此代码在std::pair中插入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&'

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;

在这里,原始海报尝试制作包含常量引用的vector pair个,然后执行此操作:

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

这会尝试将一对分配给另一对。但是const&变量不能分配给另一个变量 - 它们可以从另一个const&构建(初始化),但不能分配。

一个简单的解决方法是:

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

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

答案 2 :(得分:0)

修正所有拼写错误(ContainneraId,遗失;等)后,代码编译得很好。