5

我正在尝试处理 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' 关键字,但没有成功,但是各种有趣且经常误导的错误消息海合会,例如:

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

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

谢谢!

4

1 回答 1

3

您的显式模板实例化看起来不对。尝试将其替换为

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

(注意添加的 class 关键字)

于 2013-02-03T07:39:17.083 回答