0

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

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'

为什么叮当声(转储中的最后一行)无效?

4

2 回答 2

0

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

我相信您仍然可以将它们混合并获得您想要的代码:

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 的特化

于 2019-04-20T11:40:31.947 回答
0

我尝试只解析这个结构而没有一些#include 结构。

并且解析 typedef 是正确的。

我发现问题有所不同。

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

我发现修复:-需要执行该预处理器不会通过“致命错误:没有这样的文件”终止。

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

CI.getPreprocessor().SetSuppressIncludeNotFoundError(true);

结果我有课:

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

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

此任务已解决。

最好的问候,伊万。

于 2019-04-24T11:19:55.117 回答