[Insight-users] compilation error on linux
Karthik Krishnan
Karthik.Krishnan at kitware.com
Tue Oct 11 10:48:09 EDT 2005
There are a few differences between gcc34 and 33 and code compiling on
gcc34 will not necessarily compile on 33.
One of the differences is accessing in class static members without
using Self as a trait.
ie, you have a typedef
typedef itk::BSplineDeformableTransform
< double, ImageDimension, 3 > TransformType;
which should instead read:
typedef itk::BSplineDeformableTransform
< double, itkGetStaticConstMacro(ImageDimension), 3 >
TransformType;
Regards
karthik
Andinet Enquobahrie wrote:
> 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
>>
>>
>
>
> _______________________________________________
> 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