2016-03-03 51 views
8

考虑以下模块:使用非导出函数模板内的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和作品编译成功,但如果我用f替换g,编译器会抱怨:error C3861: 'id': identifier not found

如何解决?

+0

您是否正在使用正确的模块标志?我认为它不会从IDE本身起作用 – paulm

回答

3

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

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

+0

这种行为的原因很明显,不清楚的是如何导出模板函数。我是否只需要使用在实例化时可见的函数/变量? –

+0

Ignat,我已经更新了我的答案,详细介绍了如何解决问题。 – CodeFuller

+0

但是,如果我必须“有可能会在此模块中使用的所有实例化”,那么在用'0'替换id(0)后也不行,但它确实! –