首页 > 解决方案 > 调用 void 函数时出错操作员

问题描述

我正在尝试将一个字符串和一个空集传递给我的函数。然后我想在我的 main 中调用该函数并打印集合中的所有元素。

这是我的功能代码:

#include<iostream>
using std::cout; using std::endl;
#include<algorithm>
using std::set_union; using std::copy;
#include<iterator>
using std::inserter; using std::ostream_iterator;
#include<string>
using std::string;
#include<set>
using std::set;

void removing(const string &word, set<string> &result) {
    string del_word = word;
    char erased_l;

    for(int i = 0; i < del_word.length(); i++) {
        erased_l = word[i];
        del_word.erase(0, 1);
        del_word = erased_l + del_word;
    }
}

下面是我调用该函数的主要代码:

int main (){
    set<string> jump = {};

    set<string> del = removing("axiom", jump);
    for (string ele:del) {
        cout << ele << endl;
    }
 }

我收到以下错误:

No viable conversion from 'void' to 'set<std::__1::string>' (aka 'set<basic_string<char, char_traits<char>, allocator<char> > >')

错误在第 16 行:

    set<string> del = removing("axiom", jump);

我的代码试图完成: 如果我传入 axiom,那么我希望我的字符串设置为 {xiom, aiom, axom, axim, axio}。所以删除第一个字母,保留单词的其余部分。然后删除第二个字母,保留单词的其余部分,等等......

标签: c++

解决方案


主要问题包括:

  1. 函数的返回值void不能分配给 a set,因此您的编译器错误。您的设计是将空结果的引用传递给set函数removing并用结果数据填充它,因此您可以在此处删除分配。

  2. result您的函数内部没有添加任何内容removing,因此它在函数调用后开始为空并结束为空。

这是一个工作版本:

void removing(const string &word, set<string> &result) {
    for (int i = 0; i < word.length(); i++) {
        result.insert(word.substr(0, i) + word.substr(i + 1, word.length()));
    }
}

int main () {
    set<string> jump = {};
    removing("axiom", jump);

    for (string ele : jump) {
        cout << ele << endl;
    }
}

输出:

aiom
axim
axio
axom
xiom

话虽如此,我不清楚为什么result应该是函数的参数。如果您只打算使用它来存储这个特定的结果,那么从调用者的角度来看,这个设计似乎更清晰:

set<string> removing(const string &word) {
    set<string> result;

    for (int i = 0; i < word.length(); i++) {
        result.insert(word.substr(0, i) + word.substr(i + 1, word.length()));
    }

    return result;
}

int main () {
    set<string> jump = removing("axiom");

    for (string ele : jump) {
        cout << ele << endl;
    }
}

试试看!


推荐阅读