[Insight-users] compilation error on linux

Andinet Enquobahrie andinet.enqu at kitware.com
Tue Oct 11 10:54:54 EDT 2005


Hello Reinhard,

I compiled your code in

Linux gcc  3.4.3
ITK - cvs version
GNU make - 3.8

it compiles with no errors....

-Andinet


I tried to reproduce the problem in your code

>Hi,
>
>I am making an application to do deformable liver registrations. The
>program I made so far works fine on a windows machine using the VC++
>6.0 compiler. But now I want to move the program to a linux machine
>and refuses to compile using
>gcc 3.3.5 and make 3.8. The error is in a templated class which I
>wrote. In my program I perform a rigid registration which final
>parameters (3 translation parameters) I use to initialize the non
>rigid registration. My nonrigidregistration class has a member
>m_RigidTransformParameters which stores these parameters.
>The member function SetRigidTransform causes the following compilation error:
>
>/home/rhameeteman/source/test2/NonRigidRegistration.txx:105: error: prototype
>   for `void NonRigidRegistration<TFixedImage, TMovingImage,
>   TOutputImage>::SetRigidTransform(typename
>   itk::BSplineDeformableTransform<double, NonRigidRegistration<TFixedImage,
>   TMovingImage, TOutputImage>::ImageDimension, 3>::ParametersType)' does not
>   match any in class `NonRigidRegistration<TFixedImage, TMovingImage,
>   TOutputImage>'
>/home/rhameeteman/source/test2/NonRigidRegistration.h:209: error: candidate is:
>   void NonRigidRegistration<TFixedImage, TMovingImage,
>   TOutputImage>::SetRigidTransform(typename
>   itk::BSplineDeformableTransform<double, NonRigidRegistration<TFixedImage,
>   TMovingImage, TOutputImage>::ImageDimension, 3>::ParametersType)
>/home/rhameeteman/source/test2/NonRigidRegistration.txx:105: error: template
>   definition of non-template `void NonRigidRegistration<TFixedImage,
>   TMovingImage, TOutputImage>::SetRigidTransform(typename
>   itk::BSplineDeformableTransform<double, NonRigidRegistration<TFixedImage,
>   TMovingImage, TOutputImage>::ImageDimension, 3>::ParametersType)'
>make[1]: *** [LivReg.o] Error 1
>make: *** [default_target] Error 2
>
>What puzzles me is that the suggested candidate is exactly the same as
>the one causing the error.
>I included a sort of minimal example to demonstrate the problem. It
>compiles fine in VC, but won't build on Linux.
>I use itk 2.2.0
>
>Reinhard
>  
>
>------------------------------------------------------------------------
>
>PROJECT(LivReg)
>
>FIND_PACKAGE(ITK)
>IF(ITK_FOUND)
>  INCLUDE(${ITK_USE_FILE})
>ELSE(ITK_FOUND)
>  MESSAGE(FATAL_ERROR "ITK niet gevonden")
>ENDIF(ITK_FOUND)
>
>
>ADD_EXECUTABLE(
>LivReg                          LivReg.cpp 
>NonRigidRegistration.txx        NonRigidRegistration.h)
>
>
>TARGET_LINK_LIBRARIES(LivReg ITKNumerics ITKIO ITKAlgorithms ITKBasicFilters ITKStatistics)
>  
>
>------------------------------------------------------------------------
>
>#include <stdio.h>
>#include "NonRigidRegistration.h"
>
>int main(int argc, char * argv[])
>{
>  std::cout << "startup: Image Registration Application" << std::endl;
> 
>  char *parameterFile;
>
>  if (argc < 2 )
>  {
>    std::cout << "No filename provided, trying LiverRegistration.txt" << std::endl;
>    parameterFile = "LiverRegistration.txt";
>  }
>  else
>  {
>    parameterFile = argv[1];
>  }
>
>  const unsigned int ImageDimension = 3 ;
>  typedef unsigned char PixelType;
>
>  typedef itk::Image<PixelType, ImageDimension>			   InputImageType;
>  typedef itk::Image<PixelType, ImageDimension>			   OutputImageType;
>
>  typedef      NonRigidRegistration< InputImageType,
>                                     InputImageType,
>                                     OutputImageType >  NonRigidRegistrationType;
>
>  NonRigidRegistrationType::Pointer  m_NonRigidRegistration;
>
>  m_NonRigidRegistration = NonRigidRegistrationType::New();
>
>
>  return 0;
>}
>
>  
>
>------------------------------------------------------------------------
>
>#ifndef _NONRIGIDREGISTRATION_H_
>#define _NONRIGIDREGISTRATION_H_
>
>#include "itkBSplineDeformableTransform.h"
>#include "itkImageToImageFilter.h"
>
>
>
>template <typename TFixedImage, typename TMovingImage, typename TOutputImage>
>class NonRigidRegistration : public itk::ImageToImageFilter<TMovingImage, TOutputImage>
>{
>public:
>
>  // Standard class typedefs. 
>  typedef NonRigidRegistration  Self;
>  typedef itk::ImageToImageFilter<TMovingImage, TOutputImage>  Superclass;
>  typedef itk::SmartPointer<Self>   Pointer;
>  typedef itk::SmartPointer<const Self>  ConstPointer;
>
>  // Method for creation through the object factory.
>  itkNewMacro(Self);
>  
>  // Run-time type information (and related methods).
>  itkTypeMacro(NonRigidRegistrationMethod, ImageToImageFilter);
>
>  // ImageDimension enumeration 
>  itkStaticConstMacro(ImageDimension, unsigned int, TFixedImage::ImageDimension);
>
>  // Image Types. 
>  typedef          TFixedImage                    FixedImageType;
>  typedef typename FixedImageType::ConstPointer   FixedImagePointer;
>  
>  typedef          TMovingImage                   MovingImageType;
>  typedef typename MovingImageType::ConstPointer  MovingImagePointer;
>
>  typedef          TOutputImage                   OutputImageType;
>  typedef typename OutputImageType::Pointer       OutputImagePointer;
>
>
>  typedef itk::BSplineDeformableTransform
>               < double, 
>                 ImageDimension, 3 >    TransformType;
>
>  typedef typename TransformType::ParametersType	ParametersType;
>
>  // Initialize the transform with rigid parameters
>  void SetRigidTransform( ParametersType );
>  //void SetRigidTransform( void * );
>  
>  // Get the final transformation parameters of the registration
>  const ParametersType GetFinalTransformParameters( void );
>
>  // Get the transform
>  const TransformType * GetTransform( void );
>
>  ParametersType                        m_LastTransformParameters;
>  ParametersType                        m_RigidTransformParameters;
>  typename TransformType::Pointer		    m_NonRigidTransform;
>  
>protected:
>  NonRigidRegistration();
>  virtual ~NonRigidRegistration() {};
>  void GenerateData(void );
>
>private:
>
>  FixedImagePointer  m_FixedPtr;
>  MovingImagePointer m_MovingPtr;
>  
>  void InitializeTransform();
>};
>
>
>
>#ifndef ITK_MANUAL_INSTANTIATION
>#include "NonRigidRegistration.txx"
>#endif
>
>#endif //_NONRIGIDREGISTRATION_H_
>  
>
>------------------------------------------------------------------------
>
>#include "NonRigidRegistration.h"
>
>template <typename Type>
>inline Type max(Type const& a, Type const& b) { return b < a ? a : b; }
>
>
>
>template < typename TFixedImage, typename TMovingImage, typename TOutputImage >
>NonRigidRegistration< TFixedImage, TMovingImage, TOutputImage  >
>::NonRigidRegistration()
>{
>  this->SetNumberOfRequiredInputs( 2 );
>  m_NonRigidTransform      = TransformType::New();
>  
>}
>
>
>
>template < typename TFixedImage, typename TMovingImage, typename TOutputImage >
>void
>NonRigidRegistration< TFixedImage, TMovingImage, TOutputImage  >
>::SetRigidTransform( ParametersType rigidParameters)
>//::SetRigidTransform( void * rigidParameters)
>{
>  m_RigidTransformParameters = rigidParameters; //reinterpret_cast<ParametersType *>(rigidParameters);
>}
>
>
>
>template < typename TFixedImage, typename TMovingImage, typename TOutputImage >
>void
>NonRigidRegistration< TFixedImage, TMovingImage, TOutputImage  >
>::InitializeTransform()
>{
>  typedef typename TransformType::RegionType TransformRegionType;
>
>  TransformRegionType                             transformGridRegion;
>	typename TransformRegionType::SizeType          gridBorderSize;
>	typename TransformRegionType::SizeType          totalGridSize;
>	typename MovingImageType::RegionType::SizeType  gridSizeOnImage;
>	
>  typename FixedImageType:: SizeType fixedImageSize  = m_FixedPtr-> GetLargestPossibleRegion().GetSize();
>  typename MovingImageType::SizeType movingImageSize = m_MovingPtr->GetLargestPossibleRegion().GetSize();
>
>  // Set the number of spline nodes.
>  // Each spline needs 3 nodes outside the image: 1 on lower and 2 on the upper border.
>  // The number of splines are set in proportion to the image size.
>  // At least 2 nodes are needed in each dimension.
>  gridBorderSize.Fill(3); 
>  unsigned int numberOfNodesPerDimension = 5; //Number of nodes in the image
>  for (unsigned int ii = 0; ii < ImageDimension; ii++)
>  {
>    gridSizeOnImage[ii] = max( (int)( numberOfNodesPerDimension * 
>                                      movingImageSize[ii] / 
>                                      movingImageSize[0]  ), 2);
>  }
>   
>
>  totalGridSize = gridSizeOnImage + gridBorderSize;
> 	transformGridRegion.SetSize( totalGridSize );
>
> 	typename TransformType::SpacingType spacing = m_FixedPtr->GetSpacing();
> 	typename TransformType::OriginType  origin  = m_FixedPtr->GetOrigin();
>	
>
>	for(unsigned int r=0; r<ImageDimension; r++) 
>  {
>	    spacing[r] *= floor( static_cast<double>( fixedImageSize[r]  - 1) / 
>                           static_cast<double>( gridSizeOnImage[r] - 1) );
>    	origin[r]  -=  spacing[r]; 
>  }
>
>	m_NonRigidTransform->SetGridRegion(  transformGridRegion );
>	m_NonRigidTransform->SetGridSpacing( spacing             );
>	m_NonRigidTransform->SetGridOrigin(  origin              );
>
>  typedef typename TransformType::ParametersType TransformParametersType;
>  const unsigned int numberOfParameters = m_NonRigidTransform->GetNumberOfParameters();
>  TransformParametersType initialParameters( numberOfParameters );
>  initialParameters.fill(0.0);
>
>  // Parameters are stored in array as x1x2x3x4... y1y2y3y4... z1z2z3z4
>  const unsigned int numberOfNodes = m_NonRigidTransform->GetNumberOfParametersPerDimension();
>  for (unsigned int ii=0; ii < numberOfNodes; ii++ )
>  {
>    for (unsigned int jj=0; jj < ImageDimension; jj++)
>    {
>      initialParameters[ii+jj*numberOfNodes]   = m_RigidTransformParameters[jj];
>    }
>  }
>  
>  m_NonRigidTransform->SetParametersByValue( initialParameters );
>  return;
>}
>
>
>
>template < typename TFixedImage, typename TMovingImage, typename TOutputImage >
>void
>NonRigidRegistration< TFixedImage, TMovingImage, TOutputImage  >
>::GenerateData( void ) 
>{
>  // Initialize NonRigid Transformation
>	this->InitializeTransform();
>
>	return;
>}
>
>
>  
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Insight-users mailing list
>Insight-users at itk.org
>http://www.itk.org/mailman/listinfo/insight-users
>  
>




More information about the Insight-users mailing list