Minidx Support Forum


 
Subject: vector<string> を char * の配列で初期化できない
dingzhigang
Administrator
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 0
Credits 40
Posts 75
Reading Access 200
Registered 27-3-2007
Status Offline
Post at 6-6-2007 16:33  Profile | Blog | P.M. 
vector<string> を char * の配列で初期化できない

次のコードは、vector<string> の適切なコンストラクタを選択することに失敗するようだ。

const char *strArray[] = { "foo", "bar", "hoge" };
vector<string> strVector( strArray, strArray+3 );

しかたがないので、resize してから copy という方法で逃げる。

const char *strArray[] = { "foo", "bar", "hoge" };
vector<string> strVector( 3 );
std::copy( strArray, strArray+3, strVector.begin() );

この方法は、コンストラクタの初期化指定のところに書けないのがつらいところ。


# 従来の C 標準ライブラリに含まれる識別子は std 名前空間で宣言されていない

#include <cstdio>

int main()
{
std::printf( "foo\n" );
}


などとやると、VC++ は、「error C2039: 'printf' : 'std' のメンバではありません。」 とかいうエラーを返してくれる。要するに、cstdio は、 stdio.h への単なるシンボリックリンクってことか?


# std::string は、clear() メソッドをサポートしていない

かわりに、erase() メソッドを使う。


# set_new_handler ではなく _set_new_handler を使う

かつ、

* <new> に加え、 <new.h> もインクルードする
* ハンドラ型の名前は、new_handler ではなく、_PNH
* ハンドラ型の定義は、int (*_PNH)( unsigned int )


# using std::vector; を宣言しておいても vector<int>::iterator が使えない

やはり、std:: で修飾してやらないといけない。

std::vector<int>::iterator it = vec.begin();

テンプレートに対する using 宣言は、 その instanciation には及ばないのか? 謎だ。


# using namespace X; と using X::foo; を同時に宣言すると、 オーバーロードの解決が出来なくなる

たとえば、次のようなコードでは、foo のオーバーロードの解決ができない。 (ひょっとすると、C++ の標準仕様かも? g++ では通っちゃうけど)

namespace FOO {
void foo( int ch );
void foo( const char *s );
}

using namespace FOO;
using FOO::foo;

int main()
{
foo( "abc" );

return 0;
}


# クラステンプレート内でのテンプレート friend 関数の記法

template<class T> class Foo;
template<class T> void func( Foo<T> * );

template<class T> class Foo {
friend void func<T>( Foo<T> * ); // コンパイルエラー
friend void func( Foo<T> * ); // コンパイルが通る
};

でも、標準規格は、前者の「コンパイルエラー」のほうだ。
Top
[Adv.]
 


All times are GMT+8, the time now is 2-12-2008 03:50


Processed in 0.082096 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - Minidx Inc - Archiver - WAP