名前空間とクラスの宣言

日記放置してたけど暇になったし、せっかくだからメモ代わりに書いとこう。
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、ということは分かった。
こんな感じで使えるんじゃねーの?と思ってたが、実は違うのだ。というのが話のオチ。