0

If I use a template function with T where T = itk::Image<unsigned char>::Pointer, everything is fine:

#include <itkImage.h>

class Test
{
  public:
  template <class T>
  void Add(T patch);
};

template <class T>
void Test::Add(T patch)
{

}

int main(int, char*[])
{
  Test a;
  itk::Image<unsigned char>::Pointer image;
  a.Add(image);
  return EXIT_SUCCESS;
}

However, if I use a template function with a parameter T::Pointer where T = itk::Image<unsigned char>, I get errors:

#include <itkImage.h>

class Test
{
  public:
  template <class T>
  void Add(typename T::Pointer patch);
};

template <class T>
void Test::Add(typename T::Pointer patch)
{

}

int main(int, char*[])
{
  Test a;
  itk::Image<unsigned char>::Pointer image;
  a.Add(image);
  return EXIT_SUCCESS;
}
error: no matching function for call to ‘Test::Add(itk::SmartPointer<itk::Image<unsigned char, 2u> >&)’

Can someone explain why these are different, and how to fix the second one?

Thanks,

David

2
Contributors
2
Replies
4
Views
6 Years
Discussion Span
Last Post by daviddoria
0

Since the compiler uses the type of the parameter to figure out which template to instantiate, the only information it has is the type of the parameter, it cannot "back-trace" the type from which this parameter type comes from. This is because it cannot assume that the only type T that has a Pointer typedef of the type that you gave as parameter is the type itk::Image<unsigned char, 2u>.. what if another type has the same Pointer typedef, how would the compiler choose?

To solve the problem, you could of course call Add< itk::Image<unsigned char, 2u> >(image) instead. If you want to avoid the template argument... well, I cannot think of a solution right now.

0

Mike,

Thanks, that does the job. I don't mind telling it the template argument, I'll always know what it is. I didn't realize you could just tell it in <> before the argument list.

David

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.