C ++调用具有继承模板的函数

时间:2014-10-10 18:06:15

标签: c++ templates inheritance

所以我有一个定义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并使用断言来解决这个特殊情况。将来我想我会在函数中添加一个模板,并确保以这种方式获取数据。谢谢大家的帮助!我已经标记了我认为最好的答案,尽管每个都是可以接受的。

3 个答案:

答案 0 :(得分:2)

您收到错误是因为FFTWImageTile来自ImageTileTileGrid<FFTWImageTile>TileGrid<ImageTile>是完全不相关的类。

如何解决这个问题取决于您尚未展示的课程的实施情况。也许你可以writeDataToFile()模仿:

template<typename T>
void writeDataToFile(TileGrid<T> * grid, std::string fileName);

答案 1 :(得分:0)

使用

生成两个不同的类
TileGrid<ImageStitching::ImageTile>

TileGrid<is::FFTWImageTile>

除了从同一模板生成之外,它们之间没有任何关系。您可能希望从类TileGrid<ImageStitching::ImageTile>派生出一个实际的子类用于类型目的。

您可以对函数writeDataToFile进行模板化,但是为了对模板参数强制执行类型限制,您应该使用类似的内容......

static_assert(is_base_of<T, ImageStitching::ImageTile>>(), "T is not a base of ImageTile");

答案 2 :(得分:0)

可能适合您的选项。

  1. writeDataToFile设为功能模板。

    template <typename T> 
       void writeDataToFile(TileGrid<T> * grid, std::string fileName);
    

    在此函数的实现中,使用另一个函数模板来编写磁贴的各个元素。

    template <typename T> 
       void writeTileElement(T const& tileElement, std::ostream& out);
    

    您可以创建writeTileElement的重载版本,以处理不同类型对象的特殊处理。

  2. 使用TileGrid ImageTile*代替ImageFile

    void writeDataToFile(TileGrid<ImageStitching::ImageTile*> * grid, std::string fileName);