2017-01-04 8 views
0

using/typedefエイリアスをクラス外に移動することなく、以下のような循環依存関係を壊す方法はありますか?クラス/構造体内で定義されたパブリックエイリアス(typdef/using)へのC++の循環依存性

// header A.h 
#ifdef A 
#define A 
#include "B.h" 
class A { 
    using ID = uint32_t; 
    void some_func(B::ID id); 
}; 
#endif A 


// header B.h 
#ifdef B 
#define B 
#include "A.h" 
class B { 
    using ID = uint64_t; 
    void some_func(A::ID id); 
}; 
#endif B 


// main.cpp 
#include "A.h" 
int main() {...} 

ガード#ifdef sが存在し、IDは、より複雑なタイプ(struct等)とすることができると仮定する。

編集:明確化のビット:エイリアス名は必ずしも同じではありません(つまり、IDではありません)。

変形例:

// header A.h 
#ifdef A 
#define A 
#include "B.h" 
class A { 
    using SomeAliasInA = uint32_t; 
    void some_func(B::SomeAliasInB id); 
}; 
#endif A 


// header B.h 
#ifdef B 
#define B 
#include "A.h" 
class B { 
    using SomeAliasInB = std::string; 
    void some_func(A::SomeAliasInA id); 
}; 
#endif B 

答えて

0

型定義のための外部ファイルを作成します。

template<typename T> 
struct types{}; 

class A; 
class B; 

template<> 
struct types<A>{ 
    using alias = std::string; 
}; 

template<> 
struct types<B>{ 
    using ID = bool; 
    using alias_2 = int; 
    using alias_3 = short; 
}; 

をあなたはそのようにようにそれを使用することができます答えを

class A{ 
    void foo(types<B>::ID id); 
}; 
class B{ 
    void foo(types<A>::alias id); 
}; 
+0

感謝を。エイリアスが同じ名前の場合、あなたのソリューションは合理的です。質問を明確にして更新しました。 –

+0

@JimmyBazooka同じ答えが適用されます。あなたは 'types'構造体で必要なだけ多くのtypedefまたは別名を持つことができます。 – Quest

関連する問題