<div dir="ltr">Including the source of ItkToAvs in the header solved the problem, thank you!!<div><br></div><div>I tried to fool the compiler by calling the conversion function with 1 instead of 3:</div><div><span style="font-size:12.8px">rc = ItkToAvs<sPixelType, 1>(&pAvs, itkShortVolume);</span><br></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">The compiler however was not fooled:</span></div><div><div><span style="font-size:12.8px"><i>error C2664: 'ItkToAvs' : cannot convert parameter 2 from 'itk::SmartPointer<TObjectType>' to 'itk::SmartPointer<TObjectType>'</i></span></div><div><span style="font-size:12.8px"><i>        with</i></span></div><div><span style="font-size:12.8px"><i>        [</i></span></div><div><span style="font-size:12.8px"><i>            TObjectType=itk::Image<sPixelType,3></i></span></div><div><span style="font-size:12.8px"><i>        ]</i></span></div><div><span style="font-size:12.8px"><i>        and</i></span></div><div><span style="font-size:12.8px"><i>        [</i></span></div><div><span style="font-size:12.8px"><i>            TObjectType=itk::Image<sPixelType,1></i></span></div><div><span style="font-size:12.8px"><i>        ]</i></span></div><div><span style="font-size:12.8px"><i>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called</i></span></div><div style="font-size:12.8px"><i><br></i></div></div><div style="font-size:12.8px">So the compiler <b>knows</b> what kind of image TObjectType is. Why does it insist that you specify those parameters when it already knows them?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 11, 2016 at 2:38 PM, Timothee Evain <span dir="ltr"><<a href="mailto:tevain@telecom-paristech.fr" target="_blank">tevain@telecom-paristech.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">It seems to me that using extern with functions is redundant in C/C++ since the compiler already treat functions as extern.<br>
So no need to put extern.<br>
Regarding the link error, I don't know, just ensure the part of the code where you use the function have access to the function (is it included ?).<br>
Also if you have split the declaration and the definition, remember that template need to see definition to do instanciation so you have to include the source in the header, or both in your main code.<br>
<br>
About the function figuring out the parameter, I'm not sure it's possible for the compiler to do template argument deduction from a templated template parameter.<br>
Someone with more knowledge about it should be able to help you more than I can.<br>
<span class=""><br>
HTH,<br>
<br>
Tim<br>
<br>
<br>
<br>
<br>
<br>
----- Mail original -----<br>
De: "Lambert Zijp" <<a href="mailto:ljzijp@gmail.com">ljzijp@gmail.com</a>><br>
</span>À: "Timothee Evain" <<a href="mailto:tevain@telecom-paristech.fr">tevain@telecom-paristech.fr</a>><br>
Cc: "Matt McCormick" <<a href="mailto:matt.mccormick@kitware.com">matt.mccormick@kitware.com</a>>, <a href="mailto:insight-users@itk.org">insight-users@itk.org</a><br>
Envoyé: Vendredi 11 Mars 2016 13:14:06<br>
<span class="">Objet: Re: [ITK] [ITK-users] Conversion of itk::Image to other formats<br>
<br>
</span><span class="">Hi Timothee,<br>
<br>
Thank you for responding. That was the kind of help I hoped to get!<br>
<br>
Following code snippet compiles and links OK:<br>
<br>
</span>*template<typename ValueType,unsigned int Dimension>*<br>
*int ItkToAvs(AVSfield** ppAvs, typename<br>
itk::Image<ValueType,Dimension>::Pointer InputImage)*<br>
*{ *<br>
*  return 0;*<br>
*}*<br>
<br>
*main()*<br>
*{*<br>
*  typedef   short sPixelType;*<br>
*  typedef itk::Image<sPixelType, 3> sVolume;*<br>
<br>
*  AVSfield  *pAvs = NULL;*<br>
*  sVolume::Pointer itkShortVolume;*<br>
<br>
<br>
<br>
*  rc = ItkToAvs<sPixelType, 3>(&pAvs, itkShortVolume);*<br>
*}*<br>
<span class=""><br>
However, if I put that function in another file (included in the project of<br>
course) and add 'extern' before the 'int' return type, it compiles, but the<br>
linker complains with:<br>
</span>*error LNK2019: unresolved external symbol "int __cdecl<br>
<span class="">ItkToAvs<short,3>(struct AVSfield * *,class itk::SmartPointer<class<br>
</span>itk::Image<short,3> >)*<br>
<div class="HOEnZb"><div class="h5">I am pretty sure that all code in that file is being linked because there<br>
are other functions in it that are used...<br>
Any idea what is going on?<br>
<br>
Also, it would be nice if the conversion function ItkToAvs could figure out<br>
what the pixeltype is and what the number of dimensions are, instead of<br>
providing them when calling the function. How can that be done?<br>
<br>
Greetings,<br>
Lambert<br>
<br>
<br>
<br>
<br>
<br>
On Fri, Mar 11, 2016 at 11:35 AM, Timothee Evain <<br>
<a href="mailto:tevain@telecom-paristech.fr">tevain@telecom-paristech.fr</a>> wrote:<br>
<br>
> Hello Lambert,<br>
><br>
> Try something like this :<br>
><br>
> template<typename ValueType,unsigned int Dimension><br>
> extern int ItkToAvs(AVSfield** ppAvs, typename<br>
> itk::Image<ValueType,Dimension>::Pointer InputImage);<br>
><br>
> This way you should be able to use the function for any itkImage type,<br>
> given that you provide the ValueType and the Dimension to the function at<br>
> compile time like :<br>
><br>
> [...]=ItkToAvs<ValueType,Dimension>([...]);<br>
><br>
> But I cannot guarantee that this is the best way to do it, since I'm quite<br>
> a beginner with templates.<br>
><br>
> HTH,<br>
><br>
> Tim<br>
><br>
> ----- Mail original -----<br>
> De: "Lambert Zijp" <<a href="mailto:ljzijp@gmail.com">ljzijp@gmail.com</a>><br>
> À: "Matt McCormick" <<a href="mailto:matt.mccormick@kitware.com">matt.mccormick@kitware.com</a>><br>
> Cc: <a href="mailto:insight-users@itk.org">insight-users@itk.org</a><br>
> Envoyé: Jeudi 10 Mars 2016 18:06:35<br>
> Objet: Re: [ITK] [ITK-users] Conversion of itk::Image to other formats<br>
><br>
> Hi Matt,<br>
><br>
> Let me try it this way. I tried all the following prototypes, but none of<br>
> them worked. Probably some C++ syntax problem...<br>
><br>
> template <class T1, int T2><br>
> extern int ItkToAvs(AVSfield** ppAvs, itk::Image<T1, T2> pItkImage);<br>
><br>
> template <int T2><br>
> extern int ItkToAvs(AVSfield** ppAvs, itk::Image<fPixelType, T2><br>
> pItkImage);<br>
><br>
> extern int ItkToAvs(AVSfield** ppAvs, itk::Image<fPixelType, 3> pItkImage);<br>
><br>
> template< typename TImage><br>
> extern int ItkToAvs(AVSfield** ppAvs, TImage* pItkImage);<br>
><br>
> template< typename TPixel, unsigned int VImageDimension><br>
> extern int ItkToAvs(AVSfield** ppAvs, const itk::Image<TPixel,<br>
> VImageDimension> pItkImage);<br>
><br>
> template< typename TObjectType><br>
> extern int ItkToAvs(AVSfield** ppAvs, const itk::SmartPointer<TObjectType><br>
> pItkImage);<br>
><br>
> The first parameter is the output of the function. The second parameter is<br>
> any itk image.<br>
> As you can see, I don't know what I'm doing... Any idea what a good<br>
> prototype would be?<br>
><br>
> Greetings,<br>
> Lambert<br>
><br>
><br>
> On Thu, Mar 10, 2016 at 5:40 PM, Matt McCormick <<br>
> <a href="mailto:matt.mccormick@kitware.com">matt.mccormick@kitware.com</a> > wrote:<br>
><br>
><br>
> Hi Lambert,<br>
><br>
> A function prototype without templates would be run-time to run-time<br>
> type comparison and conversion. The example shows how to do run-time<br>
> to compile-time comparison, and it is relevant to both in-memory and<br>
> file conversion.<br>
><br>
> HTH,<br>
> Matt<br>
><br>
> On Thu, Mar 10, 2016 at 11:28 AM, Lambert Zijp < <a href="mailto:ljzijp@gmail.com">ljzijp@gmail.com</a> > wrote:<br>
> > Hi Sarthak,<br>
> > There is no file I/O involved. It is about conversion in memory. In my<br>
> > original post, MyFormat is a struct containing things like pixeltype and<br>
> > number of dimensions and a couple of pointers to the pixels, the sizes of<br>
> > the dimensions, and the coordinates. Conversion from MyFormat to itk, I<br>
> got<br>
> > more or less working. Now I want to convert from itk to MyFormat. A<br>
> function<br>
> > prototype is needed...<br>
> ><br>
> > Greetings,<br>
> > Lambert<br>
> ><br>
> > On Thu, Mar 10, 2016 at 5:02 PM, Scapegoat Sarthak<br>
> > < <a href="mailto:scapegoat.sarthak@gmail.com">scapegoat.sarthak@gmail.com</a> > wrote:<br>
> >><br>
> >> Hi Lambert,<br>
> >><br>
> >> What you could do is to make a function what just takes in a file name<br>
> as<br>
> >> input and call the templated ITK function inside as an inline function.<br>
> >> There is no way I know to do I/O in ITK without using templates.<br>
> >><br>
> >> Best,<br>
> >> Sarthak<br>
> >><br>
> >><br>
> >> On 10 March 2016 at 10:55, Lambert Zijp < <a href="mailto:ljzijp@gmail.com">ljzijp@gmail.com</a> > wrote:<br>
> >>><br>
> >>> Hi Scapegoat,<br>
> >>> Thank you for responding. What would the function prototype then be (of<br>
> >>> function that accepts any itk image. I mean, the syntax, preferably not<br>
> >>> templated)?<br>
> >>> Because I deal mostly with 3D or 4D signed short pixels (medical<br>
> images),<br>
> >>> I keep them as they are: half the memory consumption and easier<br>
> histogram<br>
> >>> computations.<br>
> >>><br>
> >>> Greetings,<br>
> >>> Lambert<br>
> >>><br>
> >>> On Thu, Mar 10, 2016 at 4:35 PM, Scapegoat Sarthak<br>
> >>> < <a href="mailto:scapegoat.sarthak@gmail.com">scapegoat.sarthak@gmail.com</a> > wrote:<br>
> >>>><br>
> >>>> I would advice you to perform a check on the image dimensions (2 or 3)<br>
> >>>> and keep the pixel type as float throughout. In any case you will be<br>
> doing<br>
> >>>> computation so the extra memory is going to be helpful.<br>
> >>>><br>
> >>>><br>
> >>>> On 10 March 2016 at 10:28, Matt McCormick <<br>
> <a href="mailto:matt.mccormick@kitware.com">matt.mccormick@kitware.com</a> ><br>
> >>>> wrote:<br>
> >>>>><br>
> >>>>> Hi Lambert,<br>
> >>>>><br>
> >>>>> This example shows how to read in an unknown image type. It<br>
> >>>>> demonstrates how to go between run-time type specification and the<br>
> >>>>> compile-image type specification of ITK.<br>
> >>>>><br>
> >>>>><br>
> >>>>><br>
> <a href="http://itk.org/ITKExamples/src/IO/ImageBase/ReadUnknownImageType/Documentation.html" rel="noreferrer" target="_blank">http://itk.org/ITKExamples/src/IO/ImageBase/ReadUnknownImageType/Documentation.html</a><br>
> >>>>><br>
> >>>>> This approach could be used for your problem.<br>
> >>>>><br>
> >>>>> HTH,<br>
> >>>>> Matt<br>
> >>>>><br>
> >>>>> On Thu, Mar 10, 2016 at 9:56 AM, Lambert Zijp < <a href="mailto:ljzijp@gmail.com">ljzijp@gmail.com</a> ><br>
> wrote:<br>
> >>>>> > Dear itk users,<br>
> >>>>> > I'm new to itk and also not very proficient in C++...<br>
> >>>>> > I want to try some deformable registration methods implemented in<br>
> >>>>> > itk, and<br>
> >>>>> > need to convert my own format of images and volumes to itk, and<br>
> back.<br>
> >>>>> > For conversion to itk, I use 'ImportImageFilter', because I do not<br>
> >>>>> > want to<br>
> >>>>> > make a copy of the pixels/voxels.<br>
> >>>>> > Converting itk images and volumes back to my own format, is giving<br>
> me<br>
> >>>>> > a<br>
> >>>>> > headache; I'm confused about 'Image', SmartPointer and ConstPointer<br>
> >>>>> > and<br>
> >>>>> > template stuff.<br>
> >>>>> > Could you get me started by suggesting me a function prototype?<br>
> >>>>> ><br>
> >>>>> > Something like:<br>
> >>>>> > int ItkToMyFormat(MyFormat** ppMyFormat, itk::Image* pItkImage);<br>
> >>>>> ><br>
> >>>>> > The ItkImage can be any pixeltype, any dimension, and vector images<br>
> >>>>> > should<br>
> >>>>> > also be accepted by the conversion routine. In that conversion<br>
> >>>>> > function, and<br>
> >>>>> > need to be able to put a switch on pixeltype and number of<br>
> >>>>> > dimensions.<br>
> >>>>> ><br>
> >>>>> > Greetings,<br>
> >>>>> > Lambert<br>
> >>>>> ><br>
> >>>>> > _____________________________________<br>
> >>>>> > Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
> >>>>> ><br>
> >>>>> > Visit other Kitware open-source projects at<br>
> >>>>> > <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
> >>>>> ><br>
> >>>>> > Kitware offers ITK Training Courses, for more information visit:<br>
> >>>>> > <a href="http://www.kitware.com/products/protraining.php" rel="noreferrer" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
> >>>>> ><br>
> >>>>> > Please keep messages on-topic and check the ITK FAQ at:<br>
> >>>>> > <a href="http://www.itk.org/Wiki/ITK_FAQ" rel="noreferrer" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
> >>>>> ><br>
> >>>>> > Follow this link to subscribe/unsubscribe:<br>
> >>>>> > <a href="http://public.kitware.com/mailman/listinfo/insight-users" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/insight-users</a><br>
> >>>>> ><br>
> >>>>> _____________________________________<br>
> >>>>> Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
> >>>>><br>
> >>>>> Visit other Kitware open-source projects at<br>
> >>>>> <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
> >>>>><br>
> >>>>> Kitware offers ITK Training Courses, for more information visit:<br>
> >>>>> <a href="http://www.kitware.com/products/protraining.php" rel="noreferrer" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
> >>>>><br>
> >>>>> Please keep messages on-topic and check the ITK FAQ at:<br>
> >>>>> <a href="http://www.itk.org/Wiki/ITK_FAQ" rel="noreferrer" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
> >>>>><br>
> >>>>> Follow this link to subscribe/unsubscribe:<br>
> >>>>> <a href="http://public.kitware.com/mailman/listinfo/insight-users" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/insight-users</a><br>
> >>>><br>
> >>>><br>
> >>><br>
> >><br>
> ><br>
><br>
><br>
> _____________________________________<br>
> Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
><br>
> Visit other Kitware open-source projects at<br>
> <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
><br>
> Kitware offers ITK Training Courses, for more information visit:<br>
> <a href="http://www.kitware.com/products/protraining.php" rel="noreferrer" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
><br>
> Please keep messages on-topic and check the ITK FAQ at:<br>
> <a href="http://www.itk.org/Wiki/ITK_FAQ" rel="noreferrer" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
><br>
> Follow this link to subscribe/unsubscribe:<br>
> <a href="http://public.kitware.com/mailman/listinfo/insight-users" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/insight-users</a><br>
><br>
> _______________________________________________<br>
> Community mailing list<br>
> <a href="mailto:Community@itk.org">Community@itk.org</a><br>
> <a href="http://public.kitware.com/mailman/listinfo/community" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/community</a><br>
><br>
</div></div></blockquote></div><br></div>