可视化 在C++模块的模板中使用非导出函数

visual Using non-exporting functions inside templates in C++ modules

本文关键字:函数 C++ 模块 可视化      更新时间:2023-10-16

考虑以下模块:

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 update 1 成功编译并工作,但如果我用 f 替换g,编译器会抱怨:error C3861: 'id': identifier not found .

如何解决?

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

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