警告レベル4

VisualStudioの設定って必要があるとき以外は変えないんで殆どがデフォルトのままなんですがそのうちの一つ、警告レベルですがデフォルトでレベル3なんですよね。私は警告が大嫌いなので絶対全部潰すようにしているんですが所詮レベル3だとたいしたことがなかった。最近わけあって(ていうかコードレビュー関連)レベル4で試したら警告出まくり。その殆どがテンプレート周りだった。
私はテンプレート大好き人間なのでライブラリとかでなくともテンプレートだらけです。もはやOOPじゃないんじゃないかと思うくらいテンプレートだらけ。理由は簡単でテンプレート使ったほうが速いから。や、実際には殆ど変わらんだろうけど(^^;

警告がたくさん出てきた奴その1

template< bool b >
class BooleanClass
{
	void Funct();
}

template< bool b >
void BooleanClass< b >::Funct()
{
	if( b ){
		//処理true
	}else{
		//処理false
	}
}

警告内容は「定数が定数です」という。まあ確かにテンプレート展開されたら定数になってif文は片方しか使われないけど、むしろそれで最適化されるのを狙ってこういう実装しているんだけどなぁ・・・。まあ仕方がないから以下のコードで回避

template< bool b >
void BooleanClass< b >::Funct(){}

template<>
void BooleanClass< true >::Funct(){
	//処理true
}

template<>
void BooleanClass< false >::Funct(){
	//処理false
}

うわテンプレートの意味ねーー!! まあそれでも警告を回避できたのだからいいのだが、実際にはそんなにうまくいかず・・・というのは以下のような状態が多いからだ。

template< class a >
class BooleanClass
{
	template< bool b >
	void Funct();
}

template< class a >
template< bool b >
void BooleanClass< a >::Funct()
{
	if( b ){
		//処理true
	}else{
		//処理false
	}
}

クラステンプレートのメンバ関数がまたテンプレートという。これだとC++の仕様上、メンバ関数だけのテンプレートの特殊化はできない。というわけでいろいろ根本的に書き直す必要がでてくるという・・・まいったorz
ちなみに、while(1)も同じ警告が出てきます。こいつはfor(;;)に置き換えたら警告が消えました。
http://msdn2.microsoft.com/ja-jp/library/6t66728h(VS.80).aspx


警告がたくさん出てきた奴その2

class ConstmemberClass
{
public:
	ConstmemberClass( int a ):m_iA( a ){}
private:
	const int m_iA;
};

警告内容は「代入演算子を生成できません」という。コピーなんてやらんから生成せんでええがなとも思うのですがそもそも原因が最初全然わかりませんでした。MSDNに聞いてみたら「constなメンバがあると出てきます」という。なめんなとか思ったんですが仕方ないからコピー防止の定番をおいておきました。

class ConstmemberClass
{
public:
	ConstmemberClass( int a ):m_iA( a ){}
private:
	const int m_iA;
	
	ConstmemberClass( const ConstmemberClass& );
	ConstmemberClass& operator=( const ConstmemberClass& );
};

http://msdn2.microsoft.com/ja-jp/library/hsyx7kbz(VS.80).aspx


警告がたくさん出てきた奴その3

short a1[10];
short b1[10];
for( int i = 0; i < 10; ++i ){
	a1[i] += b1[i];
}

警告内容は「'+=':'int'から'short'に変換しました。データが失われているかもしれません」という。最初「はぁ?」とか思ったんですが今でも「はぁ?」とか思ってます。どこが悪いのか未だによくわかりません。わかる人いたら教えてちょ。一応回避方法は+=を使わないこと。

short a1[10];
short b1[10];
for( int i = 0; i < 10; ++i ){
	a1[i] = a1[i] + b1[i];
}

うわださ!!とか思うのですが最適化ナシだと吐き出すアセンブリコードは同じです。
http://msdn2.microsoft.com/ja-jp/library/th7a07tz(VS.80).aspx


あとはSTL内部でいくつか出てたんですが・・・これはもう無理ですなorz