尝试对std :: string进行参数化,以便它支持方法" bool operator ==(int)"。我收到了错误:
$ g++ -std=c++11 te2.cc
te2.cc: In function ‘int main(int, char**)’:
te2.cc:20:20: error: no matching function for call to ‘mstring::mstring(const char [4])’
te2.cc:20:20: note: candidates are:
te2.cc:10:7: note: mstring::mstring()
te2.cc:10:7: note: candidate expects 0 arguments, 1 provided
te2.cc:10:7: note: mstring::mstring(const mstring&)
te2.cc:10:7: note: no known conversion for argument 1 from ‘const char [4]’ to ‘const mstring&’
te2.cc:10:7: note: mstring::mstring(mstring&&)
te2.cc:10:7: note: no known conversion for argument 1 from ‘const char [4]’ to ‘mstring&&’
以下是简单来源:
#include <unordered_map>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
class mstring : public string {
public:
//mstring (char* p) : std::string(p) {};
bool operator == (int x) {
int n = atoi(this->c_str());
return (n == x);
}
};
int main(int argc, char *argv[])
{
mstring t("123");
if (t == atoi(argv[1])) {
printf("yes\n");
} else {
printf("no\n");
}
}
如果我取消注释构造函数/mstring (char* p) : std::string(p) {};
,那么它会编译并运行正常。
问题是,如果可以在没有为mstring定义构造函数的情况下使其工作,只需使用基类的构造函数(无论如何都没有新的数据成员)?谢谢。
答案 0 :(得分:5)
如何提供一个独立的运算符函数而不是从std::string
继承(这使得该代码更可用于整体):
bool operator==(const std::string& s, int i) {
int n = atoi(s.c_str());
return (n == i);
}
bool operator==(int i, const std::string& s) {
return s == i;
}
甚至更通用:
template<typename T>
bool operator==(const std::string& s, T t) {
std::istringstream iss;
iss << t;
return (s == iss.str());
}
std
命名空间中的类不是要继承的,而只是在接口和函数参数中使用。继承这些类会降低您的代码的可用性,因为客户需要使用您的实现而不是仅使用std
类型。
另请注意:对于您的特定用例,根本不需要转换任何内容,除非您要声明argv[1]
包含一个数字(其中atoi()
当然不是最佳方法所以,请查找stoi()
。你可以比较字符串:
if (std::string("123") == argv[1]) {
printf("yes\n");
} else {
printf("no\n");
}
答案 1 :(得分:2)
您可以通过添加
显式继承构造函数using string::string;
你班上的