<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><DIV>Dear All:</DIV>
<DIV>&nbsp;</DIV>
<DIV>I trying to use some function template in my code. The below code is reading an image and do isotropic resampling. Now I put main function and function template in signle .cxx file. The code can be run.</DIV>
<DIV>&nbsp;</DIV>
<DIV>1: I want to seperate my function template with main function. If I put the whole&nbsp;implementation of templation function in .h file, I can make the exctable file.</DIV>
<DIV>2: If I want have individual implementation file .txx or .cxx( I tried all) and plus the header file, the code cannot be compiled and showed undefined reference to the template function. I did a google search, seems G++ requires to put all the implementation in the header.</DIV>
<DIV>3: I double the above requirement greatly. Since many of ITK template class has .txx and .h file. Can somebody teach me how can I compile the code when the .txx and .h and main code are seperate files.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Thanks </DIV>
<DIV>Baoyun</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>#if defined(_MSC_VER)<BR>#pragma warning ( disable : 4786 )<BR>#endif</DIV>
<DIV>#ifdef __BORLANDC__<BR>#define ITK_LEAN_AND_MEAN<BR>#endif</DIV>
<DIV><BR>#include "itkImage.h"<BR>#include "itkImageFileReader.h"<BR>#include "itkImageFileWriter.h"</DIV>
<DIV>// Software Guide : BeginCodeSnippet<BR>#include "itkResampleImageFilter.h"<BR>#include "itkRecursiveGaussianImageFilter.h"<BR>// Software Guide : EndCodeSnippet</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>// Software Guide : BeginCodeSnippet<BR>#include "itkIdentityTransform.h"<BR>#include "itkLinearInterpolateImageFunction.h"<BR>#include "itkAffineTransform.h"<BR>// Software Guide : EndCodeSnippet</DIV>
<DIV>// Software Guide : BeginCodeSnippet<BR>#include "itkIntensityWindowingImageFilter.h"<BR>#include "itkCastImageFilter.h"<BR>// Software Guide : EndCodeSnippet</DIV>
<DIV>template &lt;class TInputFilter, class TInternalFilter, class TScale&gt;</DIV>
<DIV>void ConfidenceConnected( TInputFilter* InputFilter, TInternalFilter* InternalFilter, TScale scale)<BR>{<BR>&nbsp; </DIV>
<DIV>&nbsp; //typedef typename TInputFilter::OutputImageType InputImageType;<BR>&nbsp; typedef typename TInputFilter::OutputImageType OutputImageType;<BR>&nbsp; typedef typename TInternalFilter::OutputImageType InternalImageType;<BR>&nbsp; typedef typename TInternalFilter::InputImageType InputImageType;<BR>}</DIV>
<DIV><BR>template &lt;class TInputFilter, class TInternalFilter, class TScale&gt;</DIV>
<DIV>void IsotropicResample( TInputFilter* InputFilter, TInternalFilter* InternalFilter, TScale scale)<BR>{<BR>&nbsp; </DIV>
<DIV>&nbsp; //typedef typename TInputFilter::OutputImageType InputImageType;<BR>&nbsp; typedef typename TInputFilter::OutputImageType OutputImageType;<BR>&nbsp; typedef typename TInternalFilter::OutputImageType InternalImageType;<BR>&nbsp; typedef typename TInternalFilter::InputImageType InputImageType;<BR>&nbsp;&nbsp; //typedef&nbsp; TInputFilter InputImageType;</DIV>
<DIV>&nbsp; typedef itk::ImageFileWriter&lt; InternalImageType &gt;&nbsp; WriterType1;<BR>&nbsp; typename WriterType1::Pointer writer1=WriterType1::New();<BR>&nbsp;&nbsp;&nbsp; typedef itk::CastImageFilter&lt; InputImageType,InternalImageType&gt; CastingFilterType1;<BR>&nbsp;&nbsp;&nbsp; typename CastingFilterType1::Pointer caster11 = CastingFilterType1::New();</DIV>
<DIV>&nbsp;&nbsp;&nbsp; typedef itk::CastImageFilter&lt; InternalImageType,OutputImageType&gt; CastingFilterType2;<BR>&nbsp;&nbsp;&nbsp; typename CastingFilterType1::Pointer caster21 = CastingFilterType1::New();</DIV>
<DIV>&nbsp;&nbsp;&nbsp; typedef itk::RecursiveGaussianImageFilter&lt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType &gt; GaussianFilterType;<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp; <BR>&nbsp; InputFilter-&gt;Update();<BR>&nbsp; //InternalFilter-&gt;SetInput(InputFilter-&gt;GetOutput());<BR>&nbsp; //InternalFilter-&gt;Update();</DIV>
<DIV>&nbsp; typename InputImageType::ConstPointer inputImage = InputFilter-&gt;GetOutput();</DIV>
<DIV>&nbsp; typename InputImageType::SpacingType inputSpacing= inputImage-&gt;GetSpacing();<BR>&nbsp; <BR>&nbsp; const double isoSpacing = sqrt( inputSpacing[2] * inputSpacing[0] )*scale;</DIV>
<DIV>&nbsp; caster11-&gt;SetInput(InputFilter-&gt;GetOutput());</DIV>
<DIV>&nbsp; typedef itk::ResampleImageFilter&lt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType, OutputImageType &gt;&nbsp; ResampleFilterType;</DIV>
<DIV>&nbsp; typename&nbsp; ResampleFilterType::Pointer resampler = ResampleFilterType::New();</DIV>
<DIV>&nbsp;<BR>&nbsp; typename GaussianFilterType::Pointer smootherX = GaussianFilterType::New();<BR>&nbsp; typename GaussianFilterType::Pointer smootherY = GaussianFilterType::New();<BR>&nbsp; typename GaussianFilterType::Pointer smootherZ = GaussianFilterType::New();</DIV>
<DIV>&nbsp;if(inputSpacing[0]&lt;isoSpacing&amp;&amp;inputSpacing[3]&lt;isoSpacing)<BR>&nbsp;&nbsp;&nbsp; {</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetInput( caster11-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetInput( smootherX-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherZ-&gt;SetInput( smootherY-&gt;GetOutput());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resampler-&gt;SetInput(smootherZ-&gt;GetOutput());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetDirection( 0 );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetDirection( 1 );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherZ-&gt;SetDirection( 2 );</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetSigma( isoSpacing );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetSigma( isoSpacing );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherZ-&gt;SetSigma( isoSpacing );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetNormalizeAcrossScale( false );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetNormalizeAcrossScale( false );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherZ-&gt;SetNormalizeAcrossScale( false );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </DIV>
<DIV>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>if(inputSpacing[0]&lt;isoSpacing&amp;&amp;inputSpacing[3]&gt;isoSpacing)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typename GaussianFilterType::Pointer smootherX = GaussianFilterType::New();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typename GaussianFilterType::Pointer smootherY = GaussianFilterType::New();</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetInput( caster11-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetInput( smootherX-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resampler-&gt;SetInput(smootherY-&gt;GetOutput());</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetDirection( 0 );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetDirection( 1 );</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetSigma( isoSpacing );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetSigma( isoSpacing );</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherX-&gt;SetNormalizeAcrossScale( false );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smootherY-&gt;SetNormalizeAcrossScale( false );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </DIV>
<DIV>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>if(inputSpacing[0]&gt;=isoSpacing&amp;&amp;inputSpacing[3]&gt;=isoSpacing)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resampler-&gt;SetInput(caster11-&gt;GetOutput());<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;<BR>&nbsp; const unsigned int Dimension=3;<BR>&nbsp; typedef itk::AffineTransform&lt;double, Dimension&gt; TransformType;</DIV>
<DIV>&nbsp; typename TransformType::Pointer transform = TransformType::New();<BR>&nbsp;&nbsp; resampler-&gt;SetTransform(transform);</DIV>
<DIV>&nbsp;&nbsp;&nbsp; typedef itk::LinearInterpolateImageFunction&lt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType, double &gt;&nbsp; InterpolatorType;<BR>&nbsp;&nbsp; typename InterpolatorType::Pointer interpolator = InterpolatorType::New();<BR>&nbsp;&nbsp; resampler-&gt;SetInterpolator( interpolator );</DIV>
<DIV>&nbsp;&nbsp; resampler-&gt;SetDefaultPixelValue( -1024 );</DIV>
<DIV>&nbsp;&nbsp; typename OutputImageType::SpacingType spacing;<BR>// <BR>&nbsp;&nbsp;&nbsp; spacing[0] = isoSpacing;<BR>&nbsp;&nbsp;&nbsp; spacing[1] = isoSpacing;<BR>&nbsp;&nbsp;&nbsp; spacing[2] = isoSpacing;<BR>// // <BR>&nbsp;&nbsp;&nbsp; resampler-&gt;SetOutputSpacing( spacing );<BR>&nbsp;&nbsp;&nbsp; resampler-&gt;SetOutputOrigin( inputImage-&gt;GetOrigin() );<BR>&nbsp;&nbsp;&nbsp; resampler-&gt;SetOutputDirection( inputImage-&gt;GetDirection() );<BR>// <BR>// <BR>&nbsp;&nbsp;&nbsp; typename InputImageType::SizeType&nbsp;&nbsp; inputSize = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputImage-&gt;GetLargestPossibleRegion().GetSize();<BR>//&nbsp;&nbsp; <BR>&nbsp;&nbsp; typedef typename InputImageType::SizeType::SizeValueType SizeValueType;<BR>// <BR>&nbsp;&nbsp; const double dx = inputSize[0] * inputSpacing[0] / isoSpacing;<BR>&nbsp;&nbsp; const double dy =
 inputSize[1] * inputSpacing[1] / isoSpacing;<BR>&nbsp;&nbsp; const double dz = (inputSize[2] - 1 ) * inputSpacing[2] / isoSpacing;</DIV>
<DIV>&nbsp;&nbsp; typename InputImageType::SizeType&nbsp;&nbsp; size;<BR>// <BR>&nbsp;&nbsp; size[0] = static_cast&lt;SizeValueType&gt;( dx );<BR>&nbsp;&nbsp; size[1] = static_cast&lt;SizeValueType&gt;( dy );<BR>&nbsp;&nbsp; size[2] = static_cast&lt;SizeValueType&gt;( dz );<BR>// <BR>&nbsp;&nbsp; resampler-&gt;SetSize( size );<BR>&nbsp;&nbsp; InternalFilter-&gt;SetInput(resampler-&gt;GetOutput());<BR>&nbsp;&nbsp; writer1-&gt;SetFileName("../data/out_test.hdr");<BR>&nbsp;&nbsp; writer1-&gt;SetInput(InternalFilter-&gt;GetOutput());</DIV>
<DIV>&nbsp;<BR>&nbsp;// inputSpacing = inputImage-&gt;GetSpacing();<BR>&nbsp;// std::cout &lt;&lt; inputImage-&gt;GetSpacing()&lt;&lt; std::endl;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp; <BR>// <BR>//&nbsp; // InternalFilter-&gt;SetInput(InputFilter-&gt;GetOutput());<BR>//&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer1-&gt;Update();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; catch( itk::ExceptionObject &amp; excep )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Exception caught !" &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;<BR>// </DIV>
<DIV><BR>};</DIV>
<DIV><BR>int main( int argc, char * argv[] )<BR>{<BR>&nbsp; if( argc &lt; 3 )<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Usage: " &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; argv[0] &lt;&lt; "&nbsp; inputImageFile&nbsp; outputImageFile&nbsp; lower upper " &lt;&lt; std::endl; <BR>&nbsp;&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>&nbsp; const&nbsp;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp;&nbsp; Dimension = 3;</DIV>
<DIV>&nbsp; typedef&nbsp;&nbsp; short&nbsp; InputPixelType;<BR>&nbsp; typedef&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalPixelType;</DIV>
<DIV>&nbsp; typedef itk::Image&lt; InputPixelType,&nbsp;&nbsp;&nbsp; Dimension &gt;&nbsp;&nbsp; InputImageType;<BR>&nbsp; typedef itk::Image&lt; InternalPixelType, Dimension &gt;&nbsp;&nbsp; InternalImageType;<BR>&nbsp; typedef&nbsp;&nbsp; short&nbsp;&nbsp; OutputPixelType;<BR>&nbsp; typedef itk::Image&lt; OutputPixelType,&nbsp;&nbsp; Dimension &gt;&nbsp;&nbsp; OutputImageType;<BR>// Software Guide : EndCodeSnippet</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp; typedef itk::ImageFileReader&lt; InputImageType&nbsp; &gt;&nbsp; ReaderType;</DIV>
<DIV>&nbsp; ReaderType::Pointer reader = ReaderType::New();</DIV>
<DIV>&nbsp; reader-&gt;SetFileName( argv[1] );</DIV>
<DIV>&nbsp; typedef itk::ImageFileWriter&lt; InternalImageType &gt;&nbsp; WriterType1;<BR>&nbsp; typedef itk::ImageFileWriter&lt; OutputImageType &gt;&nbsp; WriterType;</DIV>
<DIV>&nbsp; </DIV>
<DIV>&nbsp; InternalImageType::Pointer isotropic1=InternalImageType::New();</DIV>
<DIV><BR>&nbsp; try <BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; reader-&gt;Update();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; catch( itk::ExceptionObject &amp; excep )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Exception caught!" &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>typedef itk::CastImageFilter&lt; InputImageType,InternalImageType&gt; CastingFilterType1;<BR>&nbsp; CastingFilterType1::Pointer caster11 = CastingFilterType1::New();</DIV>
<DIV>&nbsp;<BR>&nbsp; typedef itk::CastImageFilter&lt; InternalImageType,OutputImageType&gt; CastingFilterType2;<BR>&nbsp; CastingFilterType1::Pointer caster21 = CastingFilterType1::New();<BR>&nbsp;&nbsp; <BR>&nbsp; double scale=1.0;</DIV>
<DIV>&nbsp; IsotropicResample &lt;ReaderType,CastingFilterType1,double&gt; (reader,caster11,scale);<BR>&nbsp;<BR>&nbsp; WriterType1::Pointer writer1 = WriterType1::New();</DIV>
<DIV>&nbsp; writer1-&gt;SetFileName( argv[2] );<BR>&nbsp;&nbsp; writer1-&gt;SetInput(caster11-&gt;GetOutput());<BR>&nbsp; <BR>&nbsp; try <BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; writer1-&gt;Update();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; catch( itk::ExceptionObject &amp; excep )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Exception caught !" &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>&nbsp; return EXIT_SUCCESS;<BR>}</DIV>
<DIV>&nbsp;</DIV></div><br>

      </body></html>