У меня есть следующий код, который отлично компилируется под в Visual Studio и г ++, но в Clang я получаю ошибку «Ошибка:„нс :: B“неполный типа»шаблона Clang неполного типа
Ах
#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?
Unrelated примечание стороны: '#include "хиджры"' в main.cpp не имеет смысла. – SingerOfTheFall
@SingerOfTheFall Хорошо и полезно неоднократно включать заголовки, но они должны включать в себя охранники, которые здесь не показаны. – Potatoswatter
@Potatoswatter Правильно жаль, я пропустил их при копировании. –