Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://mocaskr.blog42.fc2.com/tb.php/28-7770159c

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

C++ VCとgccの違いについて

C++03に関する情報です。最新規格とは違う場合があります。
昔掲示板に書いたのですが、埋もれてしまったのでこちらに解説付きで書き直しました。
■VC独自拡張キーワード
	__super->Method();

などは使えません。エラーになります。

■vector
詳しくはわかりませんが、vectorの型名にconstを付けるとエラーになります。
おそらく実体内部で xxxx = other のような代入が行われていてエラーになります。

■関数の引数が非constリファレンスの場合に、一時オブジェクトを直接書けない
	void Function(Type& ref);

Function(Type());

と書くとエラーになります。これは規格通りです。
↓修正
	void Function(const Type& ref);

Function(Type());

このようにconstのリファレンスにすると問題ありません。

■templateの遅延評価はされない
エラーのあるtemplateを書いてあるときに、VCでは使われる場所で遅延して評価されるため、templateが書いてあるだけではエラーになりません。
gccではtemplateの時点でエラーになります。

■templateで名前解決がらみでエラーになる
	template class TemplClass : T{
void MyFunction(){
x += 5; // xはTのメンバー
FunctionCall(x);// xはTのメンバー
}
}
;
こういう場合にエラーが発生する。
using句を追加するか、this->xと書き直すとエラーがなくなる。
	template class TemplClass : T{
using T::x;
void MyFunction(){
x += 5;
FunctionCall(x);
}
};

以下の定義もエラーになる
	template  void MyTemlFunc(){
UndefinedClass obj;
}

UndefinedClassが定義されていないのでエラーになります。
後ろで定義してもだめです。

■enumは前方宣言のまま実体を書くことができない
	enum EMyEnumType; // ←前方宣言
class MyClass(){
MyMethod(EMyEnumType);
};

のように、enumは前方宣言だけで使うとエラーになります。
ちゃんとincludeなどして定義する必要があります。

■typedefが同じものが2回書かれているとエラーになる

■auto_ptrの初期化で=は使えない
いまさらauto_ptrを使う人もあまりいないと思いますがだめです。
	std::auto_ptr ptr = new MyType();

↓修正
	std::auto_ptr ptr(new MyType());


■templateの実体化のときに関数内classが使われているとエラーになる
	void my_function(){
struct InnerStrcut{
int x;
};
InnerStrcut a, b;
a.x = 0;
b.x = 0;
std::swap(a, b); // ここでエラー
}

strcut/class定義を関数外に出すとエラーが消える。
C++11では問題がないかもしれない。
これは_countof()でエラーが発生しやすいので注意。

■文字列を非constポインタに代入すると警告
	char* pText = "text";

↓修正
	const char* pText = "text";

wcha_t, TCHARとかでも同じです。
スポンサーサイト
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://mocaskr.blog42.fc2.com/tb.php/28-7770159c

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。