Так что я класс, который определяет TileGrid:C++ Вызов функции, которая имеет шаблон, который имеет наследство
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++ ?? Я просмотрел все и не могу найти помощь в создании функции с параметром, содержащим шаблон с дочерними/родительскими отношениями.
Edit: ответы
Всеобщие были исключительными, и каждый решает этот вопрос представлен. Я думаю, решил перейти на C++ 11 и использовать assert для этого конкретного случая. В будущем, я думаю, я добавлю шаблон к функции и обеспечиваю получение данных таким образом. Спасибо всем за помощь! Я отметил, что я считаю лучшим ответом, хотя каждый из них был приемлемым.
К сожалению, мне нужны конкретные атрибуты, которые можно получить из класса ImageTile. Если бы я мог предположить, что typename T будет некоторым типом ImageTile, то я думаю, что я мог бы добавить writeDataToFile внутри TileGrid. Например, в java –
Jameshobbs
@Jameshobbs вам не нужно делать это, просто предположите это в коде, и если вы передадите что-то, что не является «ImageTile», оно просто не будет компилироваться. –
@Jameshobbs, а также, если вам нужно 'ImageTile', почему бы не передать его' writeDataToFile'? –