2016-03-03 50 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)後也不行,但它確實! –