Clang模板不完整类型

时间:2017-01-18 07:53:52

标签: c++ templates clang

我有以下代码在Visual Studio和g ++中编译好但在Clang中我得到错误“错误:'ns :: B'是一个不完整的类型”

A.H

#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);
        }

    };
}

B.h

#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中解决这个问题?

1 个答案:

答案 0 :(得分:6)

该计划格式错误,无需诊断。

[temp.res]/8

  

该程序格式错误,无需诊断,如果:

     
      
  • [...]
  •   
  • 由于不依赖于模板参数的构造,
  • 对模板后面的模板进行假设实例化将是不正确的   
  • [...]
  •