所以我有一个定义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并使用断言来解决这个特殊情况。将来我想我会在函数中添加一个模板,并确保以这种方式获取数据。谢谢大家的帮助!我已经标记了我认为最好的答案,尽管每个都是可以接受的。
答案 0 :(得分:2)
您收到错误是因为FFTWImageTile
来自ImageTile
,TileGrid<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)
可能适合您的选项。
将writeDataToFile
设为功能模板。
template <typename T>
void writeDataToFile(TileGrid<T> * grid, std::string fileName);
在此函数的实现中,使用另一个函数模板来编写磁贴的各个元素。
template <typename T>
void writeTileElement(T const& tileElement, std::ostream& out);
您可以创建writeTileElement
的重载版本,以处理不同类型对象的特殊处理。
使用TileGrid
ImageTile*
代替ImageFile
。
void writeDataToFile(TileGrid<ImageStitching::ImageTile*> * grid, std::string fileName);