从std :: string类继承时跳过添加构造函数

时间:2015-05-16 23:41:09

标签: c++ c++11

尝试对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定义构造函数的情况下使其工作,只需使用基类的构造函数(无论如何都没有新的数据成员)?谢谢。

2 个答案:

答案 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;
你班上的