错误:没有用于调用'CustomerData :: CustomerData()'的匹配函数

时间:2011-11-26 16:44:23

标签: c++ compiler-errors stdmap

这是我的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。

6 个答案:

答案 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