Clang 不解析部分特化的模板:template < class T, class U = TYPE_A<T> > class TYPE_B;

Clang does not parse a template with partial specialization: template < class T, class U = TYPE_A<T> > class TYPE_B;

我有带有模板部分特化的模板代码示例。解析时 clang 的位置,return 导致无效声明。

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 talking(转储中的最后一行)无效?

偏特化和默认参数之间存在差异。部分特化为不同的模板参数创建不同版本的代码,其中默认参数在未特化时提供模板参数。

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

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 class 仍应使用第二个参数为 `TYPE_A 的特化

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

并且解析 typedef 是正确的。

我发现问题有所不同。

预处理器尝试查找#include "file.h" - 但找不到,因此生成 "fatal error: No such file" 并且预处理器已终止。因此,接下来的预处理模板等已经停止。因此,我收到了无效声明。

我发现修复: -需要将执行该预处理器不会通过 "fatal error: No such file".

终止

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

CI.getPreprocessor().SetSuppressIncludeNotFoundError(true);

结果我有 class:

class ParseDeclarationAction : public ASTFrontendAction { public: virtual unique_ptr CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { CI.getPreprocessor().SetSuppressIncludeNotFoundError(真); return unique_ptr(新的 ParseDeclarationConsumer(&CI.getASTContext())); } };

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

此任务已解决。

此致, 伊万.