所以我有一个定义TileGrid的类:

template<typename T>
class TileGrid { ... };

我用名为ImageTile的类填充模板
class ImageTile { ... };

我有一个已定义的ImageTile子类,看起来像这样:
class FFTWImageTile : public ImageTile { ... };

在一个单独的文件中,我定义以下函数:
void writeDataToFile(TileGrid<ImageStitching::ImageTile> * grid, std::string fileName);

(注意:ImageTileFFTWImageTile都在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);

10-07 22:17