IのVisual Studioとg ++ではなく、クランに下罰金コンパイルする次のコード、私はエラーを取得する必要があり:クランテンプレート不完全な型
ああ
「エラー 『NS :: B』は不完全な型です」#pragma once
namespace ns
{
class B;
class A
{
friend class B;
class Inner
{
public:
int x;
Inner(int x) : x(x) {}
};
public:
template<typename T>
T getB(int i)
{
B b = B(Inner(i));
return T(b);
}
};
}
Bhの
#pragma once
#include "A.h"
namespace ns
{
class B
{
A::Inner i;
public:
B(A::Inner i) : i(i)
{}
operator int() const
{
return i.x;
}
};
}
main.cppに
#include "A.h"
#include "B.h"
int main()
{
ns::A a;
return a.getB<int>(5);
}
テンプレートがインスタンス化されるまでにBが完了するので、コードがうまくいくはずです。これは正しいです?もしそうなら、Clangの問題を回避する方法はありますか?
無関係なサイドノート: 'の#include "a.h"' main.cppにして無意味です。 – SingerOfTheFall
@SingerOfTheFallヘッダーを繰り返し含めるのはうまくいいですが、ここには表示されていないガードが含まれている必要があります。 – Potatoswatter
@Potatoswatter申し訳ありませんが、私はコピーするときにそれらを見逃しました。 –