名前空間とクラスの宣言
日記放置してたけど暇になったし、せっかくだからメモ代わりに書いとこう。
c++で、名前空間とクラスの宣言についてちょっと嵌った。
class piyo::fuga;
じゃダメで、
namespace piyo{ class fuga; }
で宣言すりゃokって話なんだけど。
なんのこっちゃ、と思うだろうがとりあえず以下にプログラムを。
fuga.h
#include <iostream> namespace piyo{ class fuga{ public: void print(){ std::cout << "fuga" << std::endl; } }; }
hoge.h
namespace piyo{ class fuga; } //class piyo::fuga; //こっちはだめ class hoge{ public: hoge(piyo::fuga *f){ mf=f; } piyo::fuga *mf; };
main.cpp
#include "hoge.h" #include "fuga.h" #include <iostream> using namespace std; using namespace piyo; int main(int argc, char **argv) { fuga f; hoge h(&f); h.mf->print(); char c; cin >> c; return 0; }
hoge.hが話のキモ。
コメントにもあるようにclass piyo::fuga;での宣言はコンパイルが通らない。
具体的には、namespace piyo{ class fuga; }をコメントアウトして、class piyo::fuga;でコンパイルしようとすると、
hoge.h(2): error C2653: 'piyo' : 識別子がクラス名でも名前空間名でもありません。
というエラーをくらう。(Microsoft Visual C++ 2010 Express の場合)
とりあえずnamespaceで囲う感じで宣言すりゃおk、ということは分かった。
こんな感じで使えるんじゃねーの?と思ってたが、実は違うのだ。というのが話のオチ。