当前位置:  开发笔记 > 编程语言 > 正文

Clang模板不完整类型

如何解决《Clang模板不完整类型》经验,为你挑选了1个好方法。

我有以下代码在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:
        template
        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(5);
}

从我的理解,代码应该工作,因为在模板实例化时,B是完整的.它是否正确?如果是这样,有没有办法在Clang中解决这个问题?



1> cpplearner..:

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

[temp.res]/8:

如果出现以下情况,该计划格式错误,无需诊断:

[...]

由于不依赖于模板参数的构造,或者在其定义之后立即对模板进行假设实例化将是不正确的,或者

[...]


@MikeJones:Visual不会对模板进行2遍检查(不符合标准),因此不检查非依赖代码.对于g ++,(通过2次检查),他们错过了诊断它的机会.
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有