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

时间:2016-03-03 12:25:48

标签: 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);
}

以下使用它的C ++代码:

import M;

int main() { 
    g(42);
    return 0; 
}

它成功编译VS2015更新1并且有效,但如果我用g替换f,编译器会抱怨:error C3861: 'id': identifier not found

如何解决?

1 个答案:

答案 0 :(得分:3)

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

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