最近,我一直想定义std::string的子类spstring。它在spstr.h中声明:
#include <cctype>
#include <string>
#include <algorithm>
#include <sstream>
#include <stdint.h>
#include <xstring>
class spstring : public std::string {
public:
spstring(std::string s):std::string(s){} //Declare the constructor
int stoi(); //Declare stoi
spstring Spstring(std::string s); ////Declare mandatory conversion function
};
spstring spstring::Spstring(std::string s)
{
spstring spstr(s);
return(spstr);
}
但是,在main.cpp中进行测试时:
spstring byteaddstr(std::string(argv[4])); //convertchar* to spstring
int byteadd;
byteadd=byteaddstr.stoi(); //call byteaddstr.stoi
未能符合以下条件:
听起来很奇怪,因为byteaddstr确实是spstring的一个实例,为什么不能调用其成员函数?
最佳答案
在C++中,任何可以解析为函数声明的声明,例如…
spstring byteaddstr(std::string(argv[4])); //convertchar* to spstring
被解析为函数声明。
即不是一个变量。
在这种情况下,一种解决方案是添加额外的括号:
spstring byteaddstr(( std::string(argv[4]) )); //convertchar* to spstring
尽管有些人对于Scott Meyers最初使用该术语是否像现在所使用的那样普遍存在意见分歧,但这在C++中被称为最令人讨厌的解析。
顺便说一句,一般来说,从
std::string
派生一个很好的理由,因为它增加了复杂性和困惑性(您可以放心地忽略对动态分配的担忧,因为动态分配std::string
的代码应该得到它得到的一切)。因此,我建议您不要这样做。