【问题标题】:Clang does not parse a template with partial specialization: template < class T, class U = TYPE_A<T> > class TYPE_B;Clang 不解析具有偏特化的模板:template < class T, class U = TYPE_A<T> > class TYPE_B;
【发布时间】:2019-04-20 11:06:53
【问题描述】:

我有带有模板部分专业化的模板的代码示例。解析时在哪里叮当,返回结果无效声明。

template < class T> class TYPE_A
{
};

template < class T, class U> class TYPE_B
{
};

template < class T, class U = TYPE_A<T> > class TYPE_B;

typedef TYPE_B<double> B_Test;

我有结果转储:

TypedefDecl 0x2024d557af0 <D:\Projects\Reps\NET_Desktop\Rel\Kernel\include\OdArrayPreDef.h:60:1, col:27> col:27 invalid somethingTest 'int'
`-BuiltinType 0x2024caff080 'int'

为什么clang talk(转储中的最后一行)无效?

【问题讨论】:

    标签: clang typedef c++98 libtooling


    【解决方案1】:

    部分特化和默认参数是有区别的。部分特化为不同的模板参数创建不同版本的代码,其中默认参数在未特化时提供模板参数。

    相信你仍然可以将它们混合起来得到你想要的代码:

    template < class T> class TYPE_A { };
    
    template < class T, class U = TYPE_A<T> > class TYPE_B { };
    
    template <class T> class TYPE_B<T, TYPE_A<T> > { };
    
    typedef TYPE_B<double> B_Test;
    

    B_Test 类仍应使用第二个参数为 `TYPE_A 的特化

    【讨论】:

    • 很遗憾,结果无效(。谢谢。
    【解决方案2】:

    我尝试只解析这个结构而不使用一些#include 结构。

    并且解析typedef是正确的。

    我发现问题有所不同。

    预处理器尝试查找#include "file.h" - 找不到,因此生成“致命错误:没有这样的文件”并且预处理器已终止。因此,下一步的预处理模板和其他已经停止。因此,我收到了无效的声明。

    我发现修复: - 需要不会因为“致命错误:没有这样的文件”而终止预处理器。

    我更改了代码(我将构造添加到自定义 ParseDeclarationAction 类,该类继承自 ASTFrontendAction):

    CI.getPreprocessor().SetSuppressIncludeNotFoundError(true);

    结果我有课:

    类 ParseDeclarationAction : 公共 ASTFrontendAction { 民众: virtual unique_ptr CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { CI.getPreprocessor().SetSuppressIncludeNotFoundError(true); return unique_ptr(new ParseDeclarationConsumer(&CI.getASTContext())); } };

    我认为问题可能会帮助其他 clang 用户。

    此任务已解决。

    最好的问候, 伊万。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 2016-08-28
      • 1970-01-01
      相关资源
      最近更新 更多