在C++模块中的模板内使用非导出函数

Ign*_*tov 8 c++ visual-c++

考虑以下模块:

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和作品编译成功,但如果我代替gf,编译器会抱怨:error C3861: 'id': identifier not found.

怎么解决?

Cod*_*ler 3

由于模板实例化规则,您会遇到此问题。出于与在 C++ 头文件中包含模板定义(并且不要在单独的 .cpp 文件中定义它们)相同的原因,您无法以这种方式从模块导出模板函数。

从模块导出模板函数或类不是一个好习惯,因为您应该在该模块中拥有可能会使用的所有实例化。但是,如果您出于某种原因想以这种方式实现它,您应该在模块中将函数 f() 实例化为 T 作为 int,例如在该模块中添加带有整数参数的无用调用。