我正在尝试处理 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 的帮助都会有所帮助。
谢谢!