类类型错误的向量

时间:2015-12-07 01:14:37

标签: c++ class object vector stl

所以我试图将一个int推送到我的向量中但是我这样做会遇到很多错误。我知道如果我把我的矢量变成“vector< int>”就行了类型,但我想知道如何使用对象矢量,如下面的内容。

我该怎么做才能解决这个问题?

#include <iostream>
#include <vector>
using namespace std;

class ClassName
{
public:
    ClassName()
    {}

    ~ClassName()
    {}

    void AddInt(int num)
    {
        m_Vector.push_back(num);
    }


private:
    vector<ClassName> m_Vector;
};

int main()
{
// Create our class an add a few ints
   ClassName obj;
   obj.AddInt(32);
   obj.AddInt(56);
   obj.AddInt(21);


return 0;
}

我得到的错误:

  

[错误]没有匹配的调用功能   '的std ::矢量::的push_back(INT&安培)'

     

[注意] void std :: vector&lt; _Tp,_Alloc&gt; :: push_back(const value_type&amp;)   [使用_Tp = ClassName; _Alloc = std :: allocator;   std :: vector&lt; _Tp,_Alloc&gt; :: value_type = ClassName]

2 个答案:

答案 0 :(得分:0)

正如@paddy在评论中指出的那样,你需要一个能隐式转换为你的类型的构造函数。您可以通过声明一个构造函数来执行此操作,该构造函数采用您希望转换为的类型的单个参数:

class MyInt
{
public:
    MyInt(int i) : number(i) {}
private:
    int number;
};

可以使用如下:

int main()
{
    std::vector<MyInt> numbers;
    numbers.push_back(1);
    numbers.push_back(42);
    numbers.push_back(MyInt(4)); // explicit conversion
}

但是,即使在添加构造函数之后,您当前设计将面临的主要问题是您在ClassName内声明了ClassName类型的对象,而您无法做到这一点。< / p>

使这个工作的唯一方法是声明一个指向类型的指针:

int main()
{
    std::vector< std::unique_ptr<MyInt> > v;
    v.push_back(std::make_unique<MyInt>(42));
}

哪会让你上课:

class MyInt
{
public:
    MyInt() : n(0) {}
    MyInt(int i) : n(i) {}
    void AddInt(int i)
    {
        numbers.push_back(std::make_unique<MyInt>(i));
    }
private:
    int n;
    std::vector< std::unique_ptr<MyInt> > numbers;
};

但这没有意义。我不明白为什么你希望课程ClassName有一个ClassName的向量来存储数字;但是,如果你有一个持有int的类(参见我之前的MyInt示例)然后有一个MyIntContainer类,它可以正常工作,具有以下内容:

class MyIntContainer
{
public:
    void AddInt(int i)
    {
        numbers.push_back(i);
    }
private:
    std::vector<MyInt> numbers;
};

答案 1 :(得分:0)

标准库容器必须使用完整类型进行实例化。

因此,类不可能包含std::vector本身。行vector<ClassName> m_Vector导致未定义的行为(无需诊断)。

您的选择是:

  • 使用允许不完整类型的非标准容器,例如一个Boost容器
  • 使用您已定义的其他类型的矢量
  • 使用智能指针向量
  • 以不同的方式做你想做的事

根据您的示例代码,您似乎可能需要vector<int>而不是vector<ClassName>,这样可以避免此问题。

通常,对于包含自身容器的类来说,它没有语义意义(显然,大多数此类实例必须包含一个空容器,否则您将使用无限内存)。