在以下代码中:
#include "itkImage.h"
#include "itkImageRegionIterator.h"
struct CustomImageBase
{
virtual void DoSomething() = 0;
};
template <typename TPixel>
struct CustomImage : public itk::Image<TPixel, 2>, public CustomImageBase
{
void DoSomething()
{
itk::Index<2> index;
index.Fill(0);
std::cout << this->GetPixel(index);
}
};
int main(int, char *[])
{
std::vector<CustomImageBase*> images;
CustomImage<float>* floatImage = CustomImage<float>::New().GetPointer();
CustomImage<int>* intImage = CustomImage<int>::New().GetPointer();
return EXIT_SUCCESS;
}
我收到错误:从itk :: Image *到CustomImage *
的无效信号请注意,这样可以正常工作:
itk::Image<float>* testFloatImage = itk::Image<float>::New().GetPointer();
由于CustomImage继承自itk :: Image,我不明白这个问题?
答案 0 :(得分:1)
由于CustomImage继承自itk :: Image,我不明白这个问题?
由于CustomImage
继承自itk::Image
,这意味着CustomImage*
可以隐式转换为itk::Image*
。但是,编译器抱怨相反转换:
无效的转换来自
itk::Image*
CustomImage*
这需要显式的类型转换。
我无法编译您的代码,因为我没有先决条件,并且您没有说出编译器不喜欢的代码行,因此此时很难提供进一步的帮助。
答案 1 :(得分:1)
如果B
来自A
,则无法将A*
转换为B*
。如果C
也来自A
,并且您的A*
确实指向C
对象而不是B
对象,那么如果您会发生什么?假装它是B
?转换是不安全的。在您的情况下,您知道GetPointer()
将始终返回CustomImage<T>
。编译器不知道这一点。您可以使用演员表来告诉它:
CustomImage<float>* floatImage = static_cast<CustomImage<float>*>(CustomImage<float>::New().GetPointer());
修改:这正是转换不安全的原因:在阅读了您的问题评论后,我不相信CustomImage<float>::New().GetPointer()
确实指向{{1} ,如果没有,那么强制转换只会将编译器错误转化为运行时错误。
答案 2 :(得分:0)
假设这是允许的。现在考虑以下内容:
struct yet_another_image : public itk::Image<TPixel, 2> {
}
yet_another_image img;
itk::Image<TPixel, 2>* ptr = &img; // ok
CustomImage* bad = ptr; // oops!
您可以安全地从指向派生类的指针转换为指向基类的指针,但是您无法安全地转换其他方式,因为您不知道指向的对象是否具有正确的类型。 / p>