-1

wstringWin32用にクロスコンパイルするmingwバージョン4.3.0で使用するC++クラスを作成しています。文字列を次のように機能さ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;
}

これは私にはうまくいくように見えますが、コンパイルしようとすると、この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)
$ 

本当に奇妙なのは、メソッドを取り出して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;
}

不思議です。

4

2 に答える 2

5

あなたの特定の質問への答えは、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 )

しかし、私はあなたが正しい木に吠えているとは思いません。のインスタンス化でstd::wstringある標準ライブラリにはすでにがあり、可能な限り近くなります(これは、との同じテンプレートのインスタンス化です)basic_stringwchar_tstd::stringchar

于 2011-07-04T23:28:06.360 に答える
1

std::wstringのtypedefである既存の型をいつでも使用できますstd::basic_string<wchar_t>。お気に入りの整数型に基づいて他の文字列クラスも自由に作成してください。

対応するストリームオブジェクトstd::wcoutなどがあることに注意してください。

于 2011-07-05T01:28:10.977 に答える