必须先从模块导入模板的定义

时间:2019-07-27 20:58:14

标签: c++ clang clang++ c++20

我想export(C ++ 20)别名模板。 VC ++ 2019编译代码。 Clang报告错误。哪个是正确的,为什么?

// file: m.cppm
export module m;

template<typename T> struct my_template {};

export template<typename T> using my_alias = my_template<T>;
// file: main.cpp
import m;
int main() { my_alias<int> v; }
main.cpp:2:28: error: definition of 'my_template' must be imported from module 'm' before it is required
int main() { my_alias<int> v; }
^
m.cppm:3:29: note: previous definition is here
template<typename T> struct my_template {};

1 个答案:

答案 0 :(得分:2)

该程序根据当前的C ++ 20草案(与Module TS明显不同)有效:export影响名称查找,而不再是“可用性”的抽象概念。可以通过多种方法中的任何一种来访问未导出的my_template,包括从类型是其专门技术之一的对象中推导模板参数。