这是我的CreateCustomer方法:
CustomerData Database::createCustomer(std::string const& name) {
CustomerData data(customersDb.size()+1, name);
customersDb[data.number()] = data;
// customersDb.insert(std::pair<uint, CustomerData>(data.number(), data));
return data;
}
CustomerData类的构造函数:
CustomerData::CustomerData(uint number, std::string const& name) {
m_number = number;
m_name = name;
}
这一行不正确:
customersDb[data.number()] = data;
事情是,下一行有效。我无法弄明白并且无法使用insert,因为使用[]括号访问元素也不起作用。
我甚至尝试过创建复制构造函数但没有效果:
CustomerData::CustomerData(CustomerData &data) {
m_number = data.number();
m_name = data.name();
}
这些是错误:
Database.cpp:5: instantiated from here
stl_map.h:450: error: no matching function for call to 'CustomerData::CustomerData()'
CustomerData.h:18: candidates are: CustomerData::CustomerData(CustomerData&)
CustomerData.h:17: note: CustomerData::CustomerData(uint, const std::string&)
我使用Mingw。
答案 0 :(得分:2)
operator[]
使用标准地图模板default-使用给定键构造一个元素(如果不存在)。
您的元素类型没有默认构造函数,因此不会发生这种情况。
您必须改为使用.insert
。
customersDb.insert(make_pair(data.number(), data));
我无法理解它并且不能使用insert,因为使用[]括号访问元素也不起作用。
要修改现有元素,请使用.find
检索迭代器,取消引用并执行操作。
yourMapType::iterator it = customersDb.find(data.number());
if (it != customersDb.end())
*it = data;
答案 1 :(得分:2)
它不起作用,因为operator[]
实际上首先默认构造值,然后分配给它。
您可以提供默认构造函数,也可以使用此调用:
customersDb.insert( std::map< uint, CustomerData >::value_type (data.number(), data) );
答案 2 :(得分:1)
您需要为CustomerData
类提供默认构造函数。
CustomerData::CustomerData()
{
}
或者以这样的方式实现代码,即它只调用您为类提供的构造函数。 []
需要默认构造元素。
第一个看起来更好。
错误原因:
当您为自己的类提供任何构造函数时,编译器不会生成缺省的无参数构造函数,并且您的代码需要一个,因此错误。
答案 3 :(得分:0)
阅读错误,它在那里:)
stl_map.h:450: error: no matching function for call to 'CustomerData::CustomerData()'
看起来编译器认为你实际上没有将任何信息传递给函数。
它确实认识到这两种选择:
CustomerData.h:18: candidates are: CustomerData::CustomerData(CustomerData&)
CustomerData.h:17: note: CustomerData::CustomerData(uint, const std::string&)
但是两个人都接受了你没有通过的论据。
答案 4 :(得分:0)
它试图在CustomerData类上调用构造函数,但它不存在。我很确定这与标准地图内部的工作方式有关。映射的值必须具有默认构造函数。这通常由编译器生成,但由于您已经提供了另一个构造函数,因此未生成它。
答案 5 :(得分:0)
您需要确保存在默认(空白)构造函数,以便可以在不使用args的情况下构造类型。
myclass(); //implement somewhere
您还可以提供默认参数
myclass(const std::string& value="hello"); //implement somewhere
在C ++ 11中你可以做到这一点
myclass()=default; //implementation will be generated