我得到一个'base(const std :: ios_base)'是我的代码中的私有错误。这有什么问题?

时间:2013-12-31 05:19:00

标签: c++ vector ifstream

我收到错误,它发生在Chest_vect.push_back(newChest)行;据我所知,我没有看到任何错误。但我相信我可能错过了一些小事。如果你能提供帮助,那将不胜感激!不管怎样,谢谢!

class Chest_objects {

private:
int loc_x, loc_y;
int map_x, map_y;
string obj_name = "";
string obj_id = "";
bool obj_trigger = false;
bool obj_visible = false;

public:

void setLoc_x(int x)
{
 loc_x = x;
}
void setLoc_y(int y)
{
 loc_y = y;
}
                              //OTHER GETTER AND SETTER FUNCTIONS NOT INCLUDED

Chest_objects(int x, int y);  //CONSTRUCTOR FUNCTIONS: NOTE I DON'T HAVE A COMPLETE ONE
Chest_objects();
Chest_objects(int x, int y, int my, int mx, string name, string id, bool trig, bool vis);

int getChestVect(vector<Chest_objects>& Chest_vect, const char*getFile)
{
int amount = 0;
int get_x = 0;
int get_y = 0;
int max_x;
int max_y;
char get_info;
ifstream file;
file.open(getFile);
file >> max_x >> max_y;

while(get_info != '0')
    {
        file >> get_info;
        if(get_info == '.')
        {
        get_x++;
        }
        if(get_info == 'B')
        {
        Chest_objects newChest(get_x, get_y);
        Chest_vect.push_back(newChest);
        get_x++;
        amount++;
        }
        if(get_x >= max_x)
        {
        get_x = 0;
        get_y++;
        }

    }
return amount;
}
};

int main()
{
... blah
return 0;
}

Chest_objects::Chest_objects(int x, int y)
{
loc_x = x;
loc_y = y;
}

 Chest_objects::Chest_objects()
{
loc_x = 0;
loc_y = 0;
}

错误:实例化'void std :: vector&lt; _Tp,_Alloc&gt; :: _ M_insert_aux(std :: vector&lt; _Tp,_Alloc&gt; :: iterator,const _Tp&amp;)[with _Tp = Chest_objects; _Alloc = std :: allocator; std :: vector&lt; _Tp,_Alloc&gt; :: iterator = __gnu_cxx :: __ normal_iterator&gt ;; typename std :: _ Vector_base&lt; _Tp,_Alloc&gt; :: pointer = Chest_objects *]':|

错误:'std :: ios_base :: ios_base(const std :: ios_base&amp;)'是私有的|

1 个答案:

答案 0 :(得分:2)

push_back方法要求容器中包含的类型是可复制的。该错误意味着Chest_objects类只有一个私有构造函数。因此,请检查Chest_objects是否有:

  • 复制构造函数:Chest_objects(const Chest_objects&);
  • 复制操作员:Chest_objects& operator=(const Chest_objects& rhs);

并且他们都是public

另一种可能性是你从Chest_objects中的一个类中继承<iostream>,这是不推荐的,并且编译器看到一个构造函数,std::ios标记为private ,这意味着你无法实例化或子类化它。这可能发生在单身人士身上。

但是没有办法确定,因为你没有发布所有代码。此外,在发布代码之前,尝试尽可能多地删除代码,同时保留错误。


有你的问题:

ifstream small_obj_map;

您在对象中实例化ifstreamChest_vect中的每个对象都有自己的ifstream。这几乎肯定不是你想要的。

由于您尚未编写复制构造函数或复制运算符,因此编译器正在尝试为您创建它们。默认的复制构造函数将尝试从正在复制的对象的small_obj_map构造small_obj_map。但是ifstream has no copy constructor因为并不打算复制。

您应该只在需要时在需要它的方法内创建ifstream,并在方法退出时将其销毁。它不应该是对象的一部分,因为它不需要持久保存对象。