vy3*_*y32 -1 c++ stl wchar-t vector
我正在创建一个C++ wstring类,用于mingw版本4.3.0,交叉编译Win32.我希望我的字符串工作就像std::string这意味着我想要一个erase(int pos)方法来擦除位置上的单个元素pos.
这是我的第一次尝试:
#include <wchar.h>
#include <iostream>
#include <vector>
class wstring : public std::vector<wchar_t>{
public:
void erase(size_t where){
erase(begin()+where);
}
};
int main(int argc,char **argv) {
wstring c1;
c1.push_back(L'a');
c1.push_back(L'b');
c1.push_back(L'c');
c1.erase(1);
for(size_t i = 0;i<c1.size();i++){
std::cout << "c1[" << i << "] = " << c1[i] << "\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这看起来应该对我有用,但是当我尝试编译它时,我得到了这个wacko编译错误:
$ i386-mingw32-g++ x1.cpp
x1.cpp: In member function 'void wstring::erase(size_t)':
x1.cpp:8: error: no matching function for call to 'wstring::erase(__gnu_cxx::__normal_iterator<wchar_t*, std::vector<wchar_t, std::allocator<wchar_t> > >)'
x1.cpp:7: note: candidates are: void wstring::erase(size_t)
$
Run Code Online (Sandbox Code Playgroud)
真正奇怪的是,如果我拿出erase方法并只是内联代码,我没有问题:
#include <wchar.h>
#include <iostream>
#include <vector>
class wstring : public std::vector<wchar_t>{
};
int main(int argc,char **argv) {
wstring c1;
c1.push_back(L'a');
c1.push_back(L'b');
c1.push_back(L'c');
c1.erase(c1.begin()+1);
for(size_t i = 0;i<c1.size();i++){
std::cout << "c1[" << i << "] = " << c1[i] << "\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我很神秘.
您的特定问题的答案是使用std::vector<T>::erase( iterator )而不是remove:
std::vector<int> v;
v.push_back( 1 );
v.push_back( 2 );
v.push_back( 3 );
v.erase( v.begin()+1 ); // equivalent to v.remove( 1 )
Run Code Online (Sandbox Code Playgroud)
但我不认为你在正确的树上吠叫.std::wstring标准库中已经存在一个basic_stringwith 的实例化wchar_t,并且它将尽可能接近std::string(这是同一个模板的实例化char)