[Insight-users] Template deduction failing with ITK classes but non an identical non-ITK demo

David Doria daviddoria at gmail.com
Fri Jul 27 16:13:06 EDT 2012


Can anyone explain why this doesn't work:

#include "itkCovariantVector.h"
#include "itkImage.h"

template <typename TComponent, int NumberOfComponents>
void FillImage(itk::Image<itk::CovariantVector<TComponent,
NumberOfComponents>, 2>* const image,
               itk::Image<itk::CovariantVector<TComponent,
NumberOfComponents>, 2>* const output)
{
  std::cout << "Works." << std::endl;
}

int main(int, char* [] )
{
  typedef itk::Image<itk::CovariantVector<float, 3u>, 2u> ImageType;

  ImageType::Pointer imageSmartPointer = ImageType::New();
  ImageType* image = imageSmartPointer.GetPointer();
  FillImage(image, image);
  return 0;
}
/*
no matching function for call to ‘FillImage(ImageType*&, ImageType*&)’
note: candidate is:
template<class TComponent, int NumberOfComponents> void
FillImage(itk::Image<itk::CovariantVector<TComponent,
NumberOfComponents>, 2u>*, itk::Image<itk::CovariantVector<TComponent,
NumberOfComponents>, 2u>*)
*/


-----------------
but this works fine (non-ITK):

#include <iostream>

template <typename TPixel, int Dimensions>
struct Image
{
};

template <typename TComponent, int NumberOfComponents>
struct Vector
{
};

template <typename TComponent, int NumberOfComponents>
void FillImage(Image<Vector<TComponent, NumberOfComponents>, 2 >* const image,
               Image<Vector<TComponent, NumberOfComponents>, 2 >* const output)
{
  std::cout << "Works." << std::endl;
}

int main(int, char* [] )
{
  typedef Image<Vector<float, 3>, 2 > ImageType;

  ImageType* image = new ImageType;
  FillImage(image, image);
  return 0;
}

I tried to reproduce the same thing, just with non ITK classes, and it
works, but the ITK version does not?

David


More information about the Insight-users mailing list