2012-01-25 18 views
0

私は同僚がコンパイルしたものを手に入れようとしています。本質的に、彼は大きなソフトウェアシステムから作る必要のある小さな実行可能ファイルの依存関係を減らそうとしていました。コンパイルの問題 - typedef、前方宣言、名前空間?

私はそれを完全に理解していないとして、私は完全に問題を説明できるかわからない...しかし、私はここで何が起こっているかを示すためにつもりです:

ライブラリA:  ファイル:ああ

namespace CF { 
    typedef sometype B; 
}; 

ライブラリC:  ファイルChの

//Forward declare Class 
class CF::B; 

Class D { 
    public: 
     B* UseB(); 
}; 

ライブラリC:  ファイルC.cpp

#include "C.h" 
#include "A.h" 
using CF::B; 

B* D::UseB() 
{ 
    return new B; 
} 

申し訳ありませんが、私が知っている、これは少しクレイジーに見えますが、私たちは実際に扱っているファイルのセットからそれを簡素化しようとしています。

通常、CF :: Bで複数定義エラーが発生するか、コードを再生して周囲を変更すると、CPPファイルでCF:Bのタイプが認識されないことがあります。

私の最初の質問は、私が試したようにtypedefを宣言するか、BがCF名前空間のtypedefであるという事実に対処するための方法がありますか?それはChファイルに直接含まれていますか?

+0

ヘッダーには適切なガードが含まれていますか? –

+0

はい、すべて標準のインクルードガード(#ifndef #define #endif)を持っています。 –

+0

ヘッダファイルに依存関係がないように、別のファイルからtypedefを宣言するにはどうすればよいですか?それはおそらく良い第一歩です。 –

答えて

1

前方宣言は、それがすでに名前空間であることをCFを知らない限り、コンパイラはCF::Bの外に何かを作ることができない以上

namespace CF { class B; } 

ようなものです。

コンパイラは、Bがクラスであるか組み込みの型であるかを知る必要があるため、typedefを宣言することもできません。組み込み型の中には、char*void*などの特別な規則があります。

+0

これは完全な解決策ではありませんでしたが、少し進んでビルドを進めましたので、私はそれは間違いなく疑問を与えられた最高のものだったと思う:)助けをありがとう! +1。 –

2

これはおそらくあなたを助ける:

ああ:

#ifndef NAMESPACE_A 
#define NAMESPACE_A 

namespace A 
{ 
    class B 
    { 
     public: int i; 
    }; 
} 
#endif 

CH:

#ifndef NAMESPACE_A 
#define NAMESPACE_A 
namespace A 
{ 
    class B; 
} 
#endif 

class D 
{ 
    public: 
     A::B* UseB(); 
}; 

main.cppに:

#include "a.h" 
#include "c.h" 
using A::B; 

B* D::UseB() 
{ 
    return new B(); 
} 

int main(int argc, char* argv[]) 
{ 
    D* d = new D(); 
    B* b = d->UseB(); 
    b->i = 1; 
    return 0; 
} 

...私のために正常に動作します;)

+0

'CF :: B'がクラス定義ではなくtypedefであるという事実は、質問... – ildjarn

+0

+1と助けてくれてありがとう - あなたが指定したような名前空間にもっと注意を払うでしょう:) –