对象向量 - C++。没有运算符“<<”与这些操作数匹配,错误

Posted

技术标签:

【中文标题】对象向量 - C++。没有运算符“<<”与这些操作数匹配,错误【英文标题】:Vector of Objects - C++. No operator "<<" matches these operands, Error 【发布时间】:2020-04-02 11:16:19 【问题描述】:

我是编程初学者。我有一个问题。我正在尝试对 Enigma 机器进行编码。我有两节课。一个用于 Enigma,一个用于转子。转子是谜机的小部件,这对问题无关紧要。我的问题是错误。我无法计算,函数cout &lt;&lt; rotors[0].GetRotor(); 应该返回我的整数向量。我不知道为什么会这样。我的程序不需要它,但我不确定我将转子添加到 enigma void AddRotor(Rotor rotor) rotors.push_back(rotor); function(在“TakeRotors”函数中调用)是否正常工作。在我看来,它应该工作得很好,但我无法检查它。不幸的是,调试器没有显示vector&lt;Rotor&gt; 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&lt;&lt;(std::ostream&amp;,const std::vector&lt;int&gt;&amp;),如果您需要,您需要自己提供。但是,不建议为你不拥有的类型重载运算符,所以我宁愿写一个函数:

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());

或者,您可以为&lt;&lt; 提供一个重载,以打印所有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 就是RotorGetRotor 会做什么并不明显。也许将其重命名为GetPermutations

【讨论】:

或者,如果Rotor 始终以相同的方式显示,请添加operator&lt;&lt; 以与Rotor 一起使用。 @crashmstr 好点,我打算朝不同的方向编辑,但这个建议更合理 @Leszek 坦率地说,似乎问题不在于您不知道如何提供重载(print_vector 不是重载),而是您不知道如何遍历向量.在这个答案的最后一个sn-p中有一个例子,只是它是Rotor的向量而不是int的向量 @Leszek 我添加了一个示例实现,但实际上 SO 并不是学习基础知识的最佳场所。你应该选择一个好的book 并从中学习 @Leszek 您的代码中存在更多问题,我在回答中忽略了这些问题,因为我只解决了您的要求。如果您还有其他问题,可以打开另一个问题,尽管在您的 Rotor 构造函数中您有 permutation; 什么都不做,您可能想要 this-&gt;permutation = permutation; 代替,或者更确切地说阅读并使用它:***.com/questions/2785612/…

以上是关于对象向量 - C++。没有运算符“<<”与这些操作数匹配,错误的主要内容,如果未能解决你的问题,请参考以下文章

c ++:向量没有命名类型[重复]

将标量的多维向量(张量)写入 C++ 文件

从逆序 C++ 访问向量时出现运行时错误 [关闭]

c++中向量中的随机访问[重复]

向量的C++参考

C++输入输出流对象