背景
我是C程序员,我刚决定玩C ++。
目的:
创建一个类,使用std :: basic_string将ISO 8859-1字符作为字符串读取。我知道我可以在std :: string中使用映射函数,但出于学习原因我想尝试这种方式。
问题:
我创建了一个从char_traits扩展的类和一个实现basic_string的类。现在我正在尝试创建构造函数。 构造函数应该接受一个const char指针并为它分配空间。
基于this,此构造函数已存在:
basic_string (const charT* s, const allocator_type& alloc = allocator_type());
它被定义为:
来自c-string
Copies the null-terminated character sequence (C-string) pointed by s. The length is determined by calling traits_type::length(s)."
所以我假设我可以重用那个构造函数,传递正确的参数(在本例中,unsigned char而不是char),但要么我不知道如何正确使用默认参数,要么构造函数不存在
我不确定这是否是正确的做法,所以欢迎任何有关如何做到这一点的提示/提示。
错误:
test.cpp: In constructor ‘ISO_8859_1_String::ISO_8859_1_String(const char*)’:
test.cpp:18:72: error: no matching function for call to ‘ISO_8859_1_String::ISO_8859_1_String(const unsigned char*, NULL)’
test.cpp:18:72: note: candidates are:
test.cpp:16:5: note: ISO_8859_1_String::ISO_8859_1_String(const char*)
test.cpp:16:5: note: candidate expects 1 argument, 2 provided
test.cpp:14:7: note: ISO_8859_1_String::ISO_8859_1_String(const ISO_8859_1_String&)
test.cpp:14:7: note: candidate expects 1 argument, 2 provided
代码:
#include <iostream>
using namespace std;
class ISO_8859_1_Char_Traits : public char_traits<unsigned char>{
public:
// Simple length implementation
static size_t length (const unsigned char* s){
size_t i = 0;
while (s[i++] != 0x00){};
return i;
}
};
class ISO_8859_1_String : public basic_string<unsigned char, ISO_8859_1_Char_Traits, allocator<unsigned char> >{
public:
ISO_8859_1_String(const char* s){
ISO_8859_1_String(reinterpret_cast<const unsigned char*>(s), NULL);
}
};
int main(){
ISO_8859_1_String* test = new ISO_8859_1_String("test");
return 1;
}
答案 0 :(得分:1)
在此:
class ISO_8859_1_String : public basic_string<unsigned char, ISO_8859_1_Char_Traits, allocator<unsigned char> >{
public:
ISO_8859_1_String(const char* s){
ISO_8859_1_String(reinterpret_cast<const unsigned char*>(s), NULL);
}
};
要么我的眼睛欺骗我,要么你用错误数量的参数调用构造函数(在构造函数本身中,结果)。而且,即使您传递了正确数量的参数,也可以无限地进行。
编辑:此外,第一个参数的类型无论如何都不匹配。
EDIT2:好的,我想我知道你要做什么。您正在尝试将参数传递给基类的构造函数。为此,您需要不同的语法:
ISO_8859_1_String(const char* s)
: basic_string<unsigned char, ISO_8859_1_Char_Traits, allocator<unsigned char> >(reinterpret_cast<const unsigned char*>(s), NULL) {
}
另外,我使用了一些类型别名或typedef来使其更具可读性。
ADDENDUM:基类ctor参数必须通过初始化列表传递,而不是在派生类ctor的主体中传递:
class A {
A() {}
A(int) {}
};
class B1 : public A{
// This means: Call the base class ctor with a 1.
B1() : A(1) {]
// This means: Call the base class ctor with no arguments. Then create a
// temporary A object, passing 1 to the ctor, and then throw it away.
// B1() { A(1); }
};