6

我收到错误:

error: no matching function for call to 'A::A()'
note: candidates are: A::A(const A&)
note:                 A::A(const std::string&, size_t)

由此:

#include <map>
#include <string>

using std::map;
using std::string;

class A {
public:
    string path;
    size_t size;
    A (const string& p, size_t s) : path(p), size(s) { }
    A (const A& f) : path(f.path), size(f.size) { }
    A& operator=(const A& rhs) {
        path = rhs.path;
        size = rhs.size;
        return *this;
    }
};

int main(int argc, char **argv)
{
    map<string, A> mymap;

    A a("world", 1);
    mymap["hello"] = a;      // <----- here
    A b(mymap["hello"]);     // <----- and here
}

请告诉我为什么代码需要一个没有参数的构造函数。

4

4 回答 4

7

因为map需要DefaultConstructible值,因为当使用下标运算符并且找不到键时,它会将其添加到默认构造值。

于 2013-01-04T20:16:00.467 回答
3

mymap["hello"]可以尝试创建 value-initialized A,因此需要默认构造函数。

如果您使用类型T作为map值(并计划通过 访问值operator[]),则它必须是可默认构造的 - 即您需要无参数(默认)构造函数operator[]如果未找到带有提供的键的值,则在地图上将值初始化映射的值。

于 2013-01-04T20:15:51.290 回答
3

通常,项目值不需要默认构造函数。map

它在 C++03 中是必需的,但在 C++11 中删除了该要求,它通常不是提出容器范围的要求,而是使用更细粒度的要求方案,要求使用特定的成员函数。

map::operator[]是一个这样的成员函数,因为如果具有键的项目不存在,它将使用给定的键和默认构造的值创建一个项目。

这也是没有: 它可能会修改地图的const版本的原因。map::operator[]

在 C++11 及更高版本中,您可以使用at访问器访问地图中具有给定键的项目const,而无需find.

由于map::at不尝试创建项目,因此它不需要项目类型是默认可构造的。

因此,针对您的问题的一种实用解决方案是使用map::at而不是map::operator[].

于 2016-03-02T01:10:41.093 回答
1

很长时间没有使用 C++,但是如果我没记错的话,如果你没有为类定义构造函数,编译器将为你创建一个无参数的构造函数。一旦您定义了一个带参数的构造函数,编译器就不会为您创建一个无参数的构造函数,因此,您需要创建一个。这增加了 K-ballo 暴露的内容导致您的错误。

于 2013-01-04T20:17:09.947 回答