1

次のコードでは:

#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 を継承しているため、問題がわかりませんか?

4

3 に答える 3

1

CustomImage は itk::Image を継承しているため、問題がわかりませんか?

はからCustomImage継承しているため、暗黙的に に変換できることをitk::Image意味します。ただし、コンパイラは反対の変換について不平を言っています。CustomImage*itk::Image*

から の無効な変換itk::Image* CustomImage*

これには、明示的な型キャストが必要です。

前提条件がないため、あなたのコードをコンパイルできません。また、コンパイラが気に入らないコードの行をあなたが言っていないため、この時点でさらに支援を提供することは困難です。

于 2012-01-10T20:43:17.057 に答える
1

Bから派生している場合は、にA変換できません。も から派生し、実際にはオブジェクトではなくオブジェクトを指している場合、それが? であるふりをするとどうなりますか? 変換は安全ではありません。あなたの場合、あなたはそれが常に a を返すことを知っています。コンパイラはそれを知りません。キャストを使用してそれを伝えることができます:A*B*CAA*CBBGetPointer()CustomImage<T>

CustomImage<float>* floatImage = static_cast<CustomImage<float>*>(CustomImage<float>::New().GetPointer());

編集:これがまさに変換が安全でない理由です:あなたの質問に関するコメントを読んだ後、本当に a を指しているとは思いませんCustomImage<float>::New().GetPointer()CustomImage。そうでない場合、キャストは単にコンパイラエラーをランタイムエラーに変えます。

于 2012-01-10T20:44:01.500 に答える
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!

派生クラスへのポインターから基本クラスへのポインターへの変換は安全に行うことができますが、その逆の変換は安全に行うことができません。これは、指しているオブジェクトが正しい型を持っているかどうかがわからないためです。

于 2012-01-10T20:48:10.157 に答える