显式模板实例化:MSVC与GCC

时间:2013-02-03 07:21:48

标签: c++ templates instantiation explicit

我正在尝试处理名称空间和& C ++中的模板。我可以得到以下代码在MSVC中编译(没有警告或错误),但我没有运气与CYGWIN / GCC的各种排列。任何帮助将不胜感激。

在头文件中,我声明了一个模板化的子类,如下所示:

#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;
}

在源文件中,我按如下方式实例化专用模板类:

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是一个枚举,但似乎没有问题。

我在命名空间内外尝试了类声明,但没有成功。

包含模板实现的源文件可以使用两个编译器进行编译。

我已经尝试删除显式模板即时功能并包含相关的C ++源文件,也没有任何乐趣。

我在不同的地方(在模板类def'n和我尝试创建对象的地方)尝试了'template','typename'和'typedef'关键字但没有成功,但各种有趣且经常误导GCC的错误消息,例如:

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

当它显然是! :)无论如何,将此代码从MSVC移植到GCC的任何帮助都会有所帮助。

谢谢!

1 个答案:

答案 0 :(得分:3)

您的显式模板实例化看起来不对。尝试用

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

(注意添加的类关键字)