小伙看你根骨奇佳,潜力无限,来学PHP伐。
一個不完美的解決辦法,明確實例化。 例如
templ.h 中
template <typename T> T max (T const& lhs, T const& rhs);
templ.cpp
#include "templ.h" template <typename T> T max (T const& lhs, T const& rhs) { return lhs > rhs ? lhs : rhs; } int max (int const& lhs, int const& rhs); double max (double const& lhs, double const& rhs); string max (string const& lhs, string const& rhs); //...
這樣cpp中範本被明確實例化後就不會在連結階段失敗,好處是cpp實作不會暴露給客戶,只要提供頭檔和函式庫檔案。 但限制在於模板的支援的類型是有限的,用戶有新增的類型就不支援了。
C++98標準有export關鍵字來實現模板的宣告和實作分離。 即:templ.h 中
export template <typename T> T max (T const& lhs, T const& rhs);
#include "templ.h" template <typename T> T max (T const& lhs, T const& rhs) { return lhs > rhs ? lhs : rhs; }
但是鮮有編譯器實作這個功能,而且C++11標準中export已經沒有這個功能了。
對於模板的實作程式碼,連微軟都是開源的,所以應該是沒有啥完美的解決方案了。
如果只有模板,我認為是不可能的,沒看過這種純模板封裝在dll裡面的範例,模板不是普通的c++程式碼。 。 如果自己的演算法不想暴露實現,那麼唯一的方式就是做成動態庫或者靜態庫以及模板代碼兩部分,即一部分重要實現搞到庫中,不重要的放在模板裡面,有點像boost那樣子。 。
模板基本上做不到了,大部分編譯器不支援export關鍵字
一個不完美的解決辦法,明確實例化。
例如
templ.h 中
templ.cpp
這樣cpp中範本被明確實例化後就不會在連結階段失敗,好處是cpp實作不會暴露給客戶,只要提供頭檔和函式庫檔案。
但限制在於模板的支援的類型是有限的,用戶有新增的類型就不支援了。
C++98標準有export關鍵字來實現模板的宣告和實作分離。
即:
templ.h 中
templ.cpp
但是鮮有編譯器實作這個功能,而且C++11標準中export已經沒有這個功能了。
對於模板的實作程式碼,連微軟都是開源的,所以應該是沒有啥完美的解決方案了。
如果只有模板,我認為是不可能的,沒看過這種純模板封裝在dll裡面的範例,模板不是普通的c++程式碼。 。
如果自己的演算法不想暴露實現,那麼唯一的方式就是做成動態庫或者靜態庫以及模板代碼兩部分,即一部分重要實現搞到庫中,不重要的放在模板裡面,有點像boost那樣子。 。
模板基本上做不到了,大部分編譯器不支援export關鍵字