将向量传递给 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[]
的要求
- mapped_type must meet the requirements of CopyConstructible and DefaultConstructible.
class Bandiera
必须是 CopyConstructible 和 DefaultConstructible,即定义一个副本和默认构造函数,或者你应该使用 std::map<Key,T,Compare,Allocator>::insert
或 std::map<Key,T,Compare,Allocator>::emplace
.
在此声明中
mappaColoriBandiere[nomeNazione] = b;
如果映射不包含具有键 nomeNazione
的元素,则创建此类元素时调用映射对象的默认构造函数,该映射对象用于类型 Bandiera
的对象。但是这个 class 没有默认构造函数。所以编译器报错。
您可以使用方法 insert like
代替运算符
mappaColoriBandiere.insert( { nomeNazione, b } );
我是 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[]
- mapped_type must meet the requirements of CopyConstructible and DefaultConstructible.
class Bandiera
必须是 CopyConstructible 和 DefaultConstructible,即定义一个副本和默认构造函数,或者你应该使用 std::map<Key,T,Compare,Allocator>::insert
或 std::map<Key,T,Compare,Allocator>::emplace
.
在此声明中
mappaColoriBandiere[nomeNazione] = b;
如果映射不包含具有键 nomeNazione
的元素,则创建此类元素时调用映射对象的默认构造函数,该映射对象用于类型 Bandiera
的对象。但是这个 class 没有默认构造函数。所以编译器报错。
您可以使用方法 insert like
代替运算符mappaColoriBandiere.insert( { nomeNazione, b } );