C++のswitch文で「crosses initialization of~」というエラーの対処
C++のswitch文で「crosses initialization of」というエラーの対処方法について紹介します。
1.問題点
下記のサンプルプログラムを作りました。
sample.h
class Sample {
public:
Sample();
void foo();
};
sample.cc
#include "stdio.h"
#include "sample.h"
Sample::Sample(){
}
void Sample::foo() {
printf( "Hello World!\n" );
}
test.h
class Test {
public:
Test();
void hoge(int);
};
test.cc
#include "test.h"
#include "sample.h"
Test::Test(){
}
void Test::hoge(int result) {
switch (result) {
case 0:
break;
case 1:
Sample a;
a.foo();
break;
default:
break;
}
}
int main () {
Test test;
test.hoge(1);
}
このプログラムをコンパイルすると、下記の「crosses initialization of」というエラーに遭遇します。
% g++ -g -w -ansi -fpermissive -I. test.cc sample.c
test.cc: メンバ関数 'void Test::hoge(int)' 内:
test.cc:13:20: エラー: crosses initialization of 'Sample a'
Sample a;
^
2.原因
まず、switch文はcase内ではなく、switch全体でひとつのスコープとみなされます。
よって"case 1:"に実装された変数aのスコープはswitch文全体で有効になりますが、"case 1:"が実行されなかった場合、aの定義が行われないため、コンパイルエラーとなるようです。
今回はクラス定義が対象の処理でしたが、単なる変数定義でも同様のエラーが発生します。
3.対処
"case 1"全体をブロックで囲みます(括り方はさまざまですが少なくとも変数aがカッコで括ったブロック内にあること)。
void Test::hoge(int result) {
switch (result) {
case 0:
break;
case 1: {
Sample a;
a.foo();
break;
}
default:
break;
}
}
これで変数のスコープがブロック内に閉じられます。
4.参考サイト
参考サイトは下記です。ありがとうございました。
- Getting a bunch of crosses initialization error
- Working Draft, Standard for Programming Language C++(6.7)
- switch文の途中で宣言する
- C++でオブジェクト生成時の "which is of non-class type" なんとか
Posted by yujiro このページの先頭に戻る
トラックバックURL
コメントする
greeting