考虑以下模块:
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);
}
以下使用它的C ++代码:
import M;
int main() {
g(42);
return 0;
}
它成功编译VS2015更新1并且有效,但如果我用g
替换f
,编译器会抱怨:error C3861: 'id': identifier not found
。
如何解决?
答案 0 :(得分:3)
由于模板实例化规则,您将面临此问题。出于与在C ++头文件中包含模板定义相同的原因(并且不在单独的.cpp文件中定义它们),您无法以这种方式从模块导出模板函数。
从模块导出模板函数或类不是一个好习惯,因为您应该在此模块中具有可能会使用的所有实例化。但是如果你想出于某种原因以这种方式实现它,你应该在模块中用T作为int实例化函数f(),例如:在此模块中添加带有整数参数的无用调用。