考虑以下模块:
module M;
// a private, non-exporting function
int id(int x) {
return x;
}
export
template <class T>
int f(T x) {
return id(0);
}
export
int g(int y) {
return id(1);
}
Run Code Online (Sandbox Code Playgroud)
以下使用它的C++代码:
import M;
int main() {
g(42);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它与VS2015更新1和作品编译成功,但如果我代替g用f,编译器会抱怨:error C3861: 'id': identifier not found.
怎么解决?
由于模板实例化规则,您会遇到此问题。出于与在 C++ 头文件中包含模板定义(并且不要在单独的 .cpp 文件中定义它们)相同的原因,您无法以这种方式从模块导出模板函数。
从模块导出模板函数或类不是一个好习惯,因为您应该在该模块中拥有可能会使用的所有实例化。但是,如果您出于某种原因想以这种方式实现它,您应该在模块中将函数 f() 实例化为 T 作为 int,例如在该模块中添加带有整数参数的无用调用。
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |