将向量传递给 C++ 中的构造函数时出错

Error while passing a vector to a Constructor in C++

我是 C++ OOP 的新手。似乎在我的简单代码中,我没有正确地将参数传递给 class 的构造函数。哪里出错了?

这是我定义的class

class Bandiera
{
private:
vector<string> colori;

public:
Bandiera(vector<string> c)
{
    colori = c;
}

bool biancoPresente()
{
    for (short i = 0; i < colori.size(); i++)
        if (colori[i] == "bianco")
            return true;
    return false;
}

bool rossoPresente()
{
    for (short i = 0; i < colori.size(); i++)
        if (colori[i] == "rosso")
            return true;
    return false;
}

bool colorePresente(string nomeColore)
{
    for (short i = 0; i < colori.size(); i++)
        if (colori[i] == nomeColore)
            return true;
    return false;
}
};

这是我的主要内容:

int main()
{
map<string, Bandiera> mappaColoriBandiere;
ifstream f("bandiere.txt");
string buffer, nomeNazione, colore;
vector<string> bufferColori;
while (getline(f, buffer))
{
    stringstream ss(buffer);
    ss >> nomeNazione;
    while (!ss.eof())
    {
        ss >> colore;
        bufferColori.push_back(colore);
    }
    Bandiera b(bufferColori);
    mappaColoriBandiere[nomeNazione] = b;
    bufferColori.clear();
}
map<string, Bandiera>::iterator it;
for (it = mappaColoriBandiere.begin(); it != mappaColoriBandiere.end(); it++)
    if (it->second.biancoPresente() && it->second.rossoPresente())
        cout << it->first << endl;
return 0;
}

纠正我从ifstream读取数据的代码部分。 bakc 给我的错误是这个:

c:\mingw\lib\gcc\mingw32.3.0\include\c++\tuple:1586:70: error: no matching function for call to 'Bandiera::Bandiera()'
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
bandiere.cpp:14:5: note: candidate: Bandiera::Bandiera(std::vector<std::__cxx11::basic_string<char> >)
     Bandiera(vector<string> c)
     ^~~~~~~~
bandiere.cpp:14:5: note:   candidate expects 1 argument, 0 provided
bandiere.cpp:8:7: note: candidate: Bandiera::Bandiera(const Bandiera&)
 class Bandiera
       ^~~~~~~~
bandiere.cpp:8:7: note:   candidate expects 1 argument, 0 provided
bandiere.cpp:8:7: note: candidate: Bandiera::Bandiera(Bandiera&&)
bandiere.cpp:8:7: note:   candidate expects 1 argument, 0 provided

编辑 1 感谢所有的答案,它们几乎是完美的。只需将 Defualt 构造函数添加到我的 class,我的代码就可以完美运行。问题是我的代码应该很好,还可以添加一个像这样的复制构造函数

Bandiera(const Bandiera &b)
{
    colori = b.colori;
}

但它给我的错误与最初的错误相同。希望有人能给我解释一下。谢谢

class Bandiera不符合std::map<Key,T,Compare,Allocator>::operator[]

的要求

class Bandiera 必须是 CopyConstructible 和 DefaultConstructible,即定义一个副本和默认构造函数,或者你应该使用 std::map<Key,T,Compare,Allocator>::insertstd::map<Key,T,Compare,Allocator>::emplace.

在此声明中

mappaColoriBandiere[nomeNazione] = b;

如果映射不包含具有键 nomeNazione 的元素,则创建此类元素时调用映射对象的默认构造函数,该映射对象用于类型 Bandiera 的对象。但是这个 class 没有默认构造函数。所以编译器报错。

您可以使用方法 insert like

代替运算符
mappaColoriBandiere.insert( { nomeNazione, b } );