对象向量 - C++。没有运算符“<<”与这些操作数匹配,错误
Posted
技术标签:
【中文标题】对象向量 - C++。没有运算符“<<”与这些操作数匹配,错误【英文标题】:Vector of Objects - C++. No operator "<<" matches these operands, Error 【发布时间】:2020-04-02 11:16:19 【问题描述】:我是编程初学者。我有一个问题。我正在尝试对 Enigma 机器进行编码。我有两节课。一个用于 Enigma,一个用于转子。转子是谜机的小部件,这对问题无关紧要。我的问题是错误。我无法计算,函数cout << rotors[0].GetRotor();
应该返回我的整数向量。我不知道为什么会这样。我的程序不需要它,但我不确定我将转子添加到 enigma void AddRotor(Rotor rotor) rotors.push_back(rotor);
function(在“TakeRotors”函数中调用)是否正常工作。在我看来,它应该工作得很好,但我无法检查它。不幸的是,调试器没有显示vector<Rotor> rotors;
排列的任何值,所以我不确定:( 任何帮助都会很棒。谢谢。
这是我完整的、需要的代码:)
#include <iostream>
#include <vector>
using namespace std;
class Rotor
public:
vector <int> permutation;
int position;
Rotor(vector<int> permutation)
position = 0;
permutation;
vector<int> GetRotor() const
return permutation;
;
class Enigma
public:
vector<Rotor> rotors;
void AddRotor(Rotor rotor)
rotors.push_back(rotor);
void PrintRotor(const vector<Rotor>& rotors)
cout << rotors[0].GetRotor(); // Error right here
cout << rotors[0].position;
void setupRotor(int index)
Rotor rotor = rotors[index];
void MoveRotor(int index)
rotors[index].position++;
cout << "Before" << endl;
// cout << rotors[index].permutation.data << ' ';
Enigma::PrintRotor(rotors);
rotate(rotors[index].permutation.begin(), rotors[index].permutation.begin() + rotors[index].permutation.size(), rotors[index].permutation.end());
cout << "After" << endl;
Enigma::PrintRotor(rotors);
;
vector<int> take_numbers(int number)
vector<int> numbers;
for (int i = 0; i < number; i++)
int number;
cin >> number;
numbers.push_back(number);
return numbers;
void take_rotors(int number_letters, Enigma* enigma)
int numberOfRotors;
// int numberOfNotch, positionOfNotch;
cout << "Give number of Rotors" << endl;
cin >> numberOfRotors;
for (int i=0; i < numberOfRotors; i++)
vector<int> permutation = take_numbers(number_letters);
Rotor Rotor(permutation);
enigma->AddRotor(Rotor); // I am not sure if it adds Rotors fine.
int main()
Enigma enigma;
int number_letters, move_rotor;
cout << "Give number of letters in alphabet" << endl;
cin >> number_letters;
take_rotors(number_letters, &enigma);
// take_reflectors(number_letters, &enigma);
cout << "Which rotor do you want to move (index)" << endl;
cin >> move_rotor;
enigma.MoveRotor(move_rotor);
return 0;
【问题讨论】:
如何将整数向量写入控制台?制表符分开?空间分隔?逗号分隔?每行一个?你得到这个错误是有原因的,那是因为 iostream 没有被编码为默认接受向量或任何其他复杂对象(你需要自己编写代码)。 【参考方案1】:没有operator<<(std::ostream&,const std::vector<int>&)
,如果您需要,您需要自己提供。但是,不建议为你不拥有的类型重载运算符,所以我宁愿写一个函数:
void print_vector(std::ostream& out, const std::vector<int>& vect)
for (int i : vect)
out << i << '\n';
你可以这样称呼
print_vector(std::cout, rotors[0].GetRotor());
或者,您可以为<<
提供一个重载,以打印所有Rotor
:
std::ostream& operator<<(std::ostream&,const Rotor& rotor)
out << rotor.position;
for (auto& i : rotor.GetRotor())
out << i;
// modify and add more to your likings
return out;
一旦你有了它,你还可以提供一个重载来打印你可以在Enigma::PrintRotor
中使用的转子向量(目前只打印向量的第一个元素):
std::ostream& operator<<(std::ostream& out,const std::vector<Rotor>& rotors)
for (const auto& r : rotors)
out << r << '\n';
return out;
PS你的命名有点混乱。一个Rotor
有一个GetRotor
,它返回permutations
!?!我强烈建议使用更好的名称。如果我有Rotor r;
,那么r
就是Rotor
,GetRotor
会做什么并不明显。也许将其重命名为GetPermutations
?
【讨论】:
或者,如果Rotor
始终以相同的方式显示,请添加operator<<
以与Rotor
一起使用。
@crashmstr 好点,我打算朝不同的方向编辑,但这个建议更合理
@Leszek 坦率地说,似乎问题不在于您不知道如何提供重载(print_vector
不是重载),而是您不知道如何遍历向量.在这个答案的最后一个sn-p中有一个例子,只是它是Rotor
的向量而不是int
的向量
@Leszek 我添加了一个示例实现,但实际上 SO 并不是学习基础知识的最佳场所。你应该选择一个好的book 并从中学习
@Leszek 您的代码中存在更多问题,我在回答中忽略了这些问题,因为我只解决了您的要求。如果您还有其他问题,可以打开另一个问题,尽管在您的 Rotor
构造函数中您有 permutation;
什么都不做,您可能想要 this->permutation = permutation;
代替,或者更确切地说阅读并使用它:***.com/questions/2785612/…以上是关于对象向量 - C++。没有运算符“<<”与这些操作数匹配,错误的主要内容,如果未能解决你的问题,请参考以下文章