Hi all,<br>I am getting the following error when compiling my program:<br><br>    CMakeFiles/TestProgram.dir/TestProgram.cxx.o: In function `main&#39;:<br>    TestProgram.cxx:(.text+0x18a): undefined reference to `DICMesh&lt;itk::Image&lt;short, 3u&gt;, itk::Image&lt;short, 3u&gt;, itk::Mesh&lt;itk::Vector&lt;double, 4u&gt;, 3u, itk::DefaultStaticMeshTraits&lt;itk::Vector&lt;double, 4u&gt;, 3u, 3u, float, float, itk::Vector&lt;double, 4u&gt; &gt; &gt; &gt;::DICMesh()&#39;<br>

    collect2: ld returned 1 exit status<br>    make[2]: *** [TestProgram] Error 1<br>    make[1]: *** [CMakeFiles/TestProgram.dir/all] Error 2<br>    make: *** [all] Error 2<br><br>The problem is with instantiation of a templated class.  The class is called DICMesh and inherits a bunch of stuff from a class called DIC.  TestProgram.cxx and the (truncated) DIC and DICMesh hxx/cxx files containing the constructors are below.  There seems to be something about having to use &quot;export&quot; (which I&#39;m not very familiar with) or maybe #include&#39;ing the cxx file in the hxx file (from here: <a href="http://bytes.com/topic/c/answers/128614-undefined-reference-template-class">http://bytes.com/topic/c/answers/128614-undefined-reference-template-class</a>) but none of this is reflected in any textbooks that I have referenced.<br>

<br>Does anybody have a recommendation or a reference that I could look at to solve this?  I am newish to C++ (only ever programed main functions to this point) so you may see lots of yet unidentified errors as I can&#39;t even start the de-bugging until I get this solved.<br>

<br>Thanks,<br>Seth<br>ubuntu 10.10 64bit<br>ITK 3.20 (Paul Novo&#39;s build 3.20.0-novo 1)<br>VTK 5.4 (5.4.2-7ubuntu3)<br>gcc 4:4.4.4-1ubuntu2<br>g++ 4:4.4.4-1ubuntu2<br>cmake 2.8.3-1~maverick1<br><br><br>################## TestProgram.cxx #########<br>

<br>#include &lt;iostream&gt;<br>#include &quot;DIC.hxx&quot;<br>#include &quot;DICMesh.hxx&quot;<br><br>int main(int argc, char **argv)<br>{<br>    // create the images<br>    typedef    short            ImagePixelType;<br>

    const unsigned int    dimension = 3;<br>    typedef itk::Image&lt; ImagePixelType, dimension &gt;        FixedImageType;<br>    typedef    itk::Image&lt; ImagePixelType, dimension &gt;        MovingImageType;<br>    <br>

    typedef    double            MeshPixelComponentType;<br>    typedef    itk::Vector&lt; MeshPixelComponentType,4 &gt;        MeshPixelType;<br>    typedef itk::Mesh&lt; MeshPixelType, dimension &gt;        MeshType;<br>

    MeshType::Pointer    mesh = MeshType::New(); // the mesh to be filled with the points<br>    <br>    // create the image readers<br>    typedef itk::ImageFileReader&lt; FixedImageType &gt;        FixedImageReaderType;<br>

    typedef    itk::ImageFileReader&lt; MovingImageType &gt;        MovingImageReaderType;<br>    <br>    FixedImageReaderType::Pointer    fixedReader = FixedImageReaderType::New();<br>    MovingImageReaderType::Pointer    movingReader = MovingImageReaderType::New();<br>

    <br>    fixedReader-&gt;SetFileName( argv[1] );<br>    movingReader-&gt;SetFileName( argv[2] );<br>    <br>    try<br>    {<br>        fixedReader-&gt;Update();<br>        movingReader-&gt;Update();<br>    }<br>    catch( itk::ExceptionObject &amp; err )<br>

    {<br>        std::cerr&lt;&lt;&quot;Error updating fixed and moving readers&quot;&lt;&lt;std::endl;<br>        std::cerr&lt;&lt;&quot;Message:&quot;&lt;&lt;std::endl;<br>        std::cerr&lt;&lt;err&lt;&lt;std::endl&lt;&lt;std::endl;<br>

        return EXIT_FAILURE;<br>    }<br>    <br>    // test creating a DICMesh filter<br>    DICMesh&lt;FixedImageType,MovingImageType,MeshType&gt;     DICMethod;<br>    <br>    std::cout&lt;&lt;&quot;DICMethod created.&quot;&lt;&lt;std::endl;<br>

    <br>    <br>    return 0;<br>}<br><br>######### DIC.hxx ############<br><br>#ifndef DIC_H<br>#define DIC_H<br><br>#include &lt;iostream&gt;<br>#include &lt;vector&gt;<br>#include &quot;itkImage.h&quot;<br>#include &quot;itkVector.h&quot;<br>

#include &quot;itkRegionOfInterestImageFilter.h&quot;<br>#include &quot;itkImageRegistrationMethod.h&quot;<br>#include &quot;itkMeanSquaresImageToImageMetric.h&quot; // default metric<br>#include &quot;itkRegularStepGradientDescentOptimizer.h&quot; // default optimizer<br>

#include &quot;itkTranslationTransform.h&quot; // default transform<br>#include &quot;itkLinearInterpolateImageFunction.h&quot; // default interpolator<br>#include &quot;itkImageFileReader.h&quot;<br>#include &quot;itkImageFileWriter.h&quot;<br>

<br>template &lt;typename TFixedImage, typename TMovingImage&gt;<br>class DIC<br>{<br>public:<br>    /** Types  and member functions**/<br>        <br>protected:<br>    DIC();<br>    ~DIC() {}<br>    <br>private:<br>    /** unititalized private variables. **/<br>

<br>}; // end class DIC<br><br>#endif // DIC_H<br><br>########### DIC.cxx ############<br><br>#include &quot;DIC.hxx&quot;<br><br>template &lt;typename TFixedImage, typename TMovingImage&gt;<br>DIC&lt;TFixedImage,TMovingImage&gt;<br>

::DIC()<br>{<br>    m_FixedImage = 0; // must be provided by user<br>    m_MovingImage = 0; // must be provided by user<br>    m_IRRadius = 0; // must be provided by user<br>    <br>    /** Setup the default registration method.*/<br>

    m_Registration = ImageRegistrationMethodType::New();<br>    m_Metric = itk::MeanSquaresImageToImageMetric&lt; TFixedImage, TMovingImage&gt;::New();<br>    m_Optimizer = itk::RegularStepGradientDescentOptimizer::New();<br>

    m_Transform = itk::TranslationTransform&lt; double, FixedImageType::ImageDimension &gt;::New();<br>    m_Interpolator = itk::LinearInterpolateImageFunction&lt; TFixedImage, double &gt;::New();<br>    m_Registration-&gt;SetMetric(m_Metric);<br>

    m_Registration-&gt;SetOptimizer(m_Optimizer);<br>    m_Registration-&gt;SetTransform(m_Transform);<br>    m_Registration-&gt;SetInterpolator(m_Interpolator);<br>    <br>    m_CurrentFixedImage = 0;<br>    m_CurrentMovingImage = 0;<br>

        <br>    UseWholeMovingImage = false;<br>    m_MovingIRMult = 3; // default size of the moving IR is 3 times the size of the fixed IR<br>    m_CurrentFixedImage = 0;<br>    m_FixedImageRegionList = 0;<br>    m_MovingImageRegionList = 0;<br>

}<br><br>/** All those other members. **/<br><br>############## DICMesh.hxx #############<br><br>#ifndef DICMESH_H<br>#define DICMESH_H<br><br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;cstring&gt;<br>

#include &quot;DIC.hxx&quot;<br>#include &quot;itkMesh.h&quot;<br><br>template&lt;typename TFixedImage, typename TMovingImage, typename TMeshType&gt;<br>class DICMesh : public DIC&lt;TFixedImage, TMovingImage&gt;<br>{<br>

public:<br><br>    /** Typedefs for DICMesh*/<br>       <br>    /** Inherited typedefs from DIC.*/<br>       <br>    /*...A bunch of member functions that are never called in TestProgram.cxx...*/<br><br>    DICMesh();<br>

    ~DICMesh() {}<br><br>private:<br>    /** unititalized private variables. **/   <br>    <br>}; // end class DICMesh<br><br>#endif // DICMESH_H<br><br>############### DICMesh.cxx ############<br><br>#include &quot;DICMesh.hxx&quot;<br>

<br>template&lt;typename TFixedImage, typename TMovingImage, typename TMeshType&gt;<br>DICMesh&lt;TFixedImage, TMovingImage, TMeshType&gt;<br>::DICMesh()<br>{<br>    m_OutputImage = 0; // must be provided by user<br>    m_InitialDataImage = 0; // must be provided by user    <br>

}<br><br>/** Other members **/<br>