我有以下代码在Visual Studio和g ++下编译好但在Clang我得到错误"错误:'ns :: B'是一个不完整的类型"
啊
#pragma once namespace ns { class B; class A { friend class B; class Inner { public: int x; Inner(int x) : x(x) {} }; public: templateT 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(5); }
从我的理解,代码应该工作,因为在模板实例化时,B是完整的.它是否正确?如果是这样,有没有办法在Clang中解决这个问题?
该计划格式错误,无需诊断.
[temp.res]/8:
如果出现以下情况,该计划格式错误,无需诊断:
[...]
由于不依赖于模板参数的构造,或者在其定义之后立即对模板进行假设实例化将是不正确的,或者
[...]