2013-02-03 175 views
4

我正試圖在C++中處理名稱空間&模板。我可以得到下面的代碼在MSVC中編譯(沒有警告或錯誤),但在CYGWIN/GCC的各種排列中沒有運氣。任何幫助,將不勝感激。顯式模板實例化:MSVC與GCC

在標題文件I聲明一個模板亞類如下:

#include <gdal.h> 
namespace sfms { 

template <class _type, GDALDataType _gdal> class SmfsGrid_Typed : public SfmsGrid_Base { 
public: 
    SmfsGrid_Typed(); 
    SmfsGrid_Typed(const SmfsGrid_Typed<_type, _gdal> *toCopy); 
    SmfsGrid_Typed(std::string filename); 
    virtual ~SmfsGrid_Typed(); 
    virtual bool OpenRead(); 
    virtual bool OpenWrite(); 

protected: 
    _type m_nodata_value; 

    virtual SfmsGrid_Base *New() const; 
    virtual SfmsGrid_Base *New(SfmsGrid_Base *toCopy) const; 
    virtual void initCopy(SfmsGrid_Base *copy) const; 
}; 

template SmfsGrid_Typed<double, GDT_Float64>; 
template SmfsGrid_Typed<float, GDT_Float32>; 
template SmfsGrid_Typed<int, GDT_Int32>; 

typedef SmfsGrid_Typed<double, GDT_Float64> SmfsGrid_Double; 
typedef SmfsGrid_Typed<float, GDT_Float32> SmfsGrid_Float; 
typedef SmfsGrid_Typed<int, GDT_Int32> SmfsGrid_Int; 
} 

在源文件I實例化專門模板類如下:

void hi_there() { 
//... 
sfms::SmfsGrid_Typed<int, GDT_Int32> *grid = new sfms::SmfsGrid_Typed<int, GDT_Int32>(filey); 
//... 
sfms::SmfsGrid_Int *grid2 = new sfms::SmfsGrid_Int(filey); 
//... 
} 

GDALDataType是一個枚舉,但是這似乎沒有這個問題。

我試過了名字空間內外的類聲明,沒有成功。

包含模板實現的源文件可以與兩種編譯器一起編譯。

我試過放棄明確的模板instantation,包括相關的C++源文件,也沒有喜悅。我試過'template','typename'和'typedef'關鍵字在各種不同的地方(在模板類def'n和我嘗試創建對象)沒有成功,但各種有趣和經常誤導性的GCC錯誤信息,如:

error: 'SmfsGrid_Typed' is not a member of 'sfms' 

什麼時候顯然是! :)無論如何,從MSVC移植到GCC的任何幫助都會有所幫助。

謝謝!

+2

我無處模板上的專家附近,但我知道聲明模板特語法將'模板<>類SmfsGrid_Typed < double,GDT_FLoat32>;'... – us2012

+1

@ us2012這是一個模板專門化(當你提供一個備選定義); OP正在尋找模板實例(使用現有的定義)。 – Angew

回答

3

您的顯式模板實例化看起來不正確。試着用

template class SmfsGrid_Typed<double, GDT_Float64>; 
template class SmfsGrid_Typed<float, GDT_Float32>; 
template class SmfsGrid_Typed<int, GDT_Int32>; 

替換它(請注意添加class關鍵字)

+0

謝謝,就是這樣! –