所以我有一个定义TileGrid的类:
template<typename T>
class TileGrid { ... };
我用名为
ImageTile
的类填充模板class ImageTile { ... };
我有一个已定义的
ImageTile
子类,看起来像这样:class FFTWImageTile : public ImageTile { ... };
在一个单独的文件中,我定义以下函数:
void writeDataToFile(TileGrid<ImageStitching::ImageTile> * grid, std::string fileName);
(注意:
ImageTile
和FFTWImageTile
都在ImageStitching命名空间中)现在,以上所有的编译都很好,但是当我尝试使用它时,我得到了一个错误。
这是一个使用它的示例测试用例:
namespace is = ImageStitching;
TileGrid<is::FFTWImageTile> * grid = new TileGrid<is::FFTWImageTile> ( ... );
writeTranslationsToFile(grid, "output.txt");
编译测试用例时,出现以下错误:
error: cannot convert ‘TileGrid<ImageStitching::FFTWImageTile>*’ to ‘TileGrid<ImageStitching::ImageTile>*’ for argument ‘1’ to ‘void writeTranslationsToFile(TileGrid<ImageStitching::ImageTile>*, std::string)’
无论如何,我可以在C++中做到这一点?我四处张望,似乎无法找到一些帮助,使该函数的参数带有具有子/父关系的模板。
编辑:
每个人的答案都非常出色,每个人都能解决所提出的问题。我认为决定移至C++ 11并针对此特定情况使用断言。将来,我想我将向该函数添加一个模板,并确保以这种方式获取数据。谢谢大家的帮助!我已经标记了我认为是最佳答案,尽管每个答案都可以接受。
最佳答案
之所以会出现错误,是因为尽管FFTWImageTile
是从ImageTile
派生的,但TileGrid<FFTWImageTile>
和TileGrid<ImageTile>
是绝对不相关的类。
如何解决此问题取决于您未显示的类的实现。也许您可以使writeDataToFile()
模板化:
template<typename T>
void writeDataToFile(TileGrid<T> * grid, std::string fileName);