【问题标题】:C++: no match for call to '(concat) (std::string&)'C ++:不匹配调用'(concat)(std :: string&)'
【发布时间】:2017-08-20 12:52:04
【问题描述】:

我一直在尝试编写此 C++ 程序,以使用运算符 (+=) 上的运算符重载连接作为用户输入的字符串。我已经定义了构造函数来初始化对象以及将字符串作为参数。但它仍然显示错误

错误:不匹配调用 '(concat) (std::string&)'|

这是 3 个文件的代码=> ma​​in.cpp

#include <iostream>
#include "concat.h"
#include<string>
using namespace std;

int main()
{
concat ob[10];
concat result;
int i;
string ip;
cout<<"Enter the strings upto 10 in different lines.. \n";
for(i=0;i<(sizeof(ob)/sizeof(ob[0]));i++){
    cin>>ip;
    ob[i](ip);
}

while(i!=0){
    result += ob[i++];
}
cout<<result.input;
}

concat.h

#ifndef CONCAT_H
#define CONCAT_H
#include<string>
using namespace std;

class concat
{
public:
    string input;
    concat();
    concat(string ip);
    concat operator+=(concat );

};

#endif // CONCAT_H

concat.cpp

#include <iostream>
#include "concat.h"
#include<string>
using namespace std;

concat::concat(){
}
concat::concat(string ip)
:input(ip)
{
}
concat concat::operator+=(concat ipObj){
    this->input += ipObj.input;
    return *this;
}

【问题讨论】:

  • 在初始化concat 对象时,您使用ob[i](ip)。为此,您需要一个函数调用运算符(即 operator()(string const&amp;) 在您的 concat 类型上。您可能想编写 ob[i] = concat(ip)ob[i] = ip (因为 std::string 的构造函数是隐式的,这种方法应该有效,也)。另外,总是在使用之前检查您的输入是否成功:if (std::cin &gt;&gt; ip) { ... }
  • 我确实尝试使用第二种方法进行更改,将 ob[i](ip) 更改为 ob[i] = concat(ip) 以及 ob[i]= ip。它执行没有错误,但在我输入后,程序崩溃了。

标签: c++ string class operator-overloading


【解决方案1】:

这就是你的concat 类原型应该看起来的样子:

class concat
{
public:
    string input;
    concat() = default;
    concat& operator+=(const concat&);

    // assignment operator
    concat& operator=(const string& str) {  
        input = str;
        return *this;
    }
};

然后使用ob[i] = ip; 代替ob[i](ip)

另外,你的程序崩溃是因为你写了result += ob[i++];
而不是result += ob[--i];

【讨论】:

  • 即使在那之后它也崩溃了。
  • 哎呀,对不起,我从 i-- 更改为 --i
  • 那是因为i == sizeof(ob)/sizeof(ob[0]) 在那个时刻是max index + 1 导致超出范围异常。因为i--首先得到i的值,然后才递减
  • 我将 while 循环更改为 for 循环,并使用 i++ 按输入顺序递增。并将 ob[i](ip) 替换为 ob[i]=(ip);。它解决了问题。
  • 我仍然认为class = string 不是最佳做法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
相关资源
最近更新 更多