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

DefaultConstructiblemap値が必要なため、添え字演算子を使用していてキーが見つからない場合は、デフォルトの構築値にマップされて追加されます。

于 2013-01-04T20:16:00.467 に答える
3

mymap["hello"]値が初期化されたものを作成しようとする可能性があるAため、デフォルトのコンストラクターが必要です。

Tmap値として使用している場合(およびを介して値にアクセスすることを計画している場合operator[])、デフォルトで構築可能である必要があります。つまり、パラメーターのない(デフォルトの)コンストラクターが必要ですoperator[]マップ上の値は、提供されたキーを持つ値が見つからない場合、マップされた値を初期化します。

于 2013-01-04T20:15:51.290 に答える
3

In general a default constructor is not required for a map item value.

It was required in C++03, but that requirement was dropped in C++11, which often instead of posing container-wide requirements uses a more fine grained requirement scheme with requirements on the use of particular member functions.

これmap::operator[]は、そのようなメンバー関数の1つです。これは、キーを持つアイテムが存在しない場合に、指定されたキーとデフォルトで作成された値を持つアイテムを作成するためです。

constこれは、バージョンがない理由でもありmap::operator[]ます:マップを変更する可能性があります。

C ++ 11以降では、アクセサーを使用して、の冗長性や複雑さを伴わずatに、マップ内の特定のキーを持つアイテムにアクセスできます。constfind

map::atはアイテムを作成しようとしないため、アイテムタイプがデフォルトで作成可能である必要はありません。

したがって、問題の実用的な解決策の1つは、map::atの代わりにを使用することですmap::operator[]

于 2016-03-02T01:10:41.093 に答える
1

長い間C++を使用していませんでしたが、クラスのコンストラクターを定義しなかった場合、コンパイラーはパラメーターのないコンストラクターを作成します。パラメーターを使用してコンストラクターを定義するとすぐに、コンパイラーはパラメーターのないコンストラクターを作成しないため、作成する必要があります。これは、K-balloが公開したものに追加されてエラーにつながります。

于 2013-01-04T20:17:09.947 に答える