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

C++ C++;调用具有继承模板的函数,c++,templates,inheritance,C++,Templates,Inheritance,我有一个类定义了一个TileGrid: template<typename T> class TileGrid { ... }; 我有一个子类ImageTile,我已经定义了它,它看起来像这样: class FFTWImageTile : public ImageTile { ... }; 在一个单独的文件中,我定义了以下函数: void writeDataToFile(TileGrid<ImageStitching::ImageTile> * grid, std::

我有一个类定义了一个TileGrid:

template<typename T>
class TileGrid { ... };
我有一个子类
ImageTile
,我已经定义了它,它看起来像这样:

class FFTWImageTile : public ImageTile { ... };
在一个单独的文件中,我定义了以下函数:

void writeDataToFile(TileGrid<ImageStitching::ImageTile> * grid, std::string fileName);
编译测试用例时,我遇到以下错误:

错误:无法将参数“1”的“TileGrid*”转换为“TileGrid*”,将其转换为“void writeTranslationsToFile(TileGrid*,std::string)”

不管怎样,我能在C++中实现这一点吗?我已经看了所有的地方,似乎找不到一些帮助来创建一个函数,该函数的参数具有一个具有子/父关系的模板

编辑:


每个人的回答都是例外,每个人都解决了提出的问题。我想我决定转向C++11,并在这个特殊情况下使用断言。在将来,我想我会为函数添加一个模板,并确保以这种方式获取数据。谢谢大家的帮助!我已经标出了我认为最好的答案,尽管每个答案都是可以接受的。

您得到了错误,因为尽管
FFTWImageTile
是从
ImageTile
派生的,
TileGrid
TileGrid
是绝对不相关的类

如何解决这一问题取决于尚未显示的类的实现。也许您可以将
writeDataofile()
模板化:

template<typename T>
void writeDataToFile(TileGrid<T> * grid, std::string fileName);
模板
void writeDataToFile(TileGrid*grid,std::string文件名);

您使用

TileGrid<ImageStitching::ImageTile>

可能适合您的选项

  • 使
    writeDataofile
    成为函数模板

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

  • 不幸的是,我需要可以从ImageTile类获得的特定属性。如果我可以推断typename T将是某种类型的ImageTile,那么我想我可以在TileGrid中添加WriteDataTable。例如,在java@Jameshobbs中,你不必推断它,只要在代码中假设它,如果你传递的不是
    imageTable
    ,它就不会编译。@Jameshobbs,而且,如果你需要
    imageTable
    本身,为什么不把它传递给
    writeDataToFile
    ?TileGrid包含一个t数组,所以我要求TileGrid在特定的行中给我一个元素,col index。因此WriteDataofile背后的主要思想是输出网格的数据,这些数据包括相对于原始磁贴的北部和西部数据。C++11的状态如何,启用支持是一个好主意吗?如果可以的话,一定要使用C++11/14。对11的编译器支持相当全面(VS可能仍然缺少一些东西,GCC和Clang通常都是功能完整的)。我还编写Java,您可能会更习惯于使用C++11。谢谢您的建议。还有一件事我可以向我的老板提出,为什么我们应该改用C++11/14:D。C++11之前甚至没有一个标准化的内存模型,或者哈希映射(
    std::unordered_map
    ),或者一大堆其他基本的东西。至少,您可能想看看。我现在正在使用boost来处理线程、正则表达式和其他事情。但他们对模板的使用让我发疯,尤其是他们的GraphAPI。
    TileGrid<ImageStitching::ImageTile>
    
    TileGrid<is::FFTWImageTile>
    
    static_assert(is_base_of<T, ImageStitching::ImageTile>>(), "T is not a base of ImageTile");
    
    template <typename T> 
       void writeDataToFile(TileGrid<T> * grid, std::string fileName);
    
    template <typename T> 
       void writeTileElement(T const& tileElement, std::ostream& out);
    
    void writeDataToFile(TileGrid<ImageStitching::ImageTile*> * grid, std::string fileName);