[Insight-developers] GetInverseTransform - MSVC 6 instantiation bug
Luis Ibanez
luis.ibanez at kitware.com
Fri Apr 10 11:30:01 EDT 2009
Hi Tom,
Yes, of course I tried the minimal example
without the problematic typedef.
That's indeed how I could pinpoint that
this was the problematic typedef :-)
and that's how we arrive to the option of
replacing that typedef with a different one
that is not carrying along the trait of the
alternative Transform instantiation.
The workaround of vnl_matrix_fixed may do the
trick here....but at the price of ugly #ifdefs.
If we are going to go that route,
then I rather simply do:
#if VCL_VS6
typedef TransformBase InverseTransformBaseType;
#else
typedef Transform<
TScalarType,
NOutputDimensions,
NInputDimensions > InverseTransformBaseType;
#endif
It is a lot cleaner than the VXL work around
Regards,
Luis
----------------------
Tom Vercauteren wrote:
> Thanks Luis,
>
> It would be good if we could have the correct return type because as
> you mention, once it is released, the API is there "forever". However,
> using TransformBase instead of Transform< T, NOutputDimensions,
> NInputDimensions > might be sufficient.
>
> It is really good to have the minimal example you wrote. Maybe we
> could try posting it to some visual c++ guru forum and see if someone
> comes up with a workaround. Maybe
> http://social.msdn.microsoft.com/Forums/en-US/vclanguage/threads
> or
> comp.lang.c++
>
> As a wild guess, did you try the minimal example without the
> problematic typedef?
>
> template <class T, unsigned int N, unsigned int M>
> class FOO
> {
> public:
> typedef T SomeTrait;
> typedef FOO<T,M,N> BAR;
>
> typename BAR::SomeTrait GetInverse()
> {
> BAR::SomeTrait a;
> return a;
> }
> };
>
> int main()
> {
> typedef FOO<float, 3, 2> FooType;
> FooType foo;
> FooType::BAR::SomeTrait at = foo.GetInverse();
> return 0;
> }
>
> Tom
>
> On Fri, Apr 10, 2009 at 00:30, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>
>>Hi Bill, Tom,
>>
>>I tried the workaround from vnl_matrix_fixed without success.
>>
>>The work around seem to be indeed addressing the same case of defining
>>a base class of transposed NumCols and NumRows.... so it is still likely
>>that I didn't applied the workaround properly.
>>
>>
>>In the meantime, I have replaced the return inverse type:
>>
>> Transform< T, NOutputDimensions, NInputDimensions >
>>
>>with
>>
>> TransformBase
>>
>>CVS commit:
>>http://public.kitware.com/cgi-bin/viewcvs.cgi/Code/Common/itkTransform.h?root=Insight&r1=1.66&r2=1.67&sortby=date
>>
>>I must admit that the original type is the correct type to use here,
>>so it may still be worth to further investigate the VS60 work around.
>>
>>In the meantime, the code should work fine with the change above.
>>
>>
>>
>>BTW: Something went wrong with the style checking of the first commit,
>>but it seems that despite the problem the file was committed.
>>
>>I then fixed a missing space on the comment line 117 and made a second commit:
>>http://public.kitware.com/cgi-bin/viewcvs.cgi/Code/Common/itkTransform.h?root=Insight&r1=1.67&r2=1.68&sortby=date
>>that curiously doesn't show any change...
>>maybe because it was just a space ?
>>
>>
>> Luis
>>
>>
>>--------------------------------
>>On Thu, Apr 9, 2009 at 11:04 AM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>>
>>>Luis,
>>>
>>>Look at vnl_matrix_fixed.h. They have some kind of a VS6 workaround.
>>>
>>>Bill
>>>
>>>On Thu, Apr 9, 2009 at 10:14 AM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>>>
>>>>Hi Tom,
>>>>
>>>>Here is what I have found so far:
>>>>The problem in VS6.0 can be replicated with the following minimal code:
>>>>
>>>>
>>>>template <class T, unsigned int N, unsigned int M>
>>>>class FOO
>>>>{
>>>>public:
>>>> typedef T SomeTrait;
>>>> typedef FOO<T,M,N> BAR;
>>>> typedef typename BAR::SomeTrait BARTrait; // <<-----THIS
>>>>
>>>> BAR GetInverse()
>>>> {
>>>> BAR a;
>>>> return a;
>>>> }
>>>>};
>>>>
>>>>
>>>>int main()
>>>>{
>>>> typedef FOO<float, 3, 2> FooType;
>>>> FooType foo;
>>>> FooType::BAR at = foo.GetInverse();
>>>> return 0;
>>>>}
>>>>
>>>>
>>>>This generates the now familiar-looking compilation error:
>>>>
>>>>G:\bin\TenplateRecurssion\main.cxx(10) : error C2027: use of undefined
>>>>type 'FOO<float,3,2>'
>>>> G:\bin\TenplateRecurssion\main.cxx(10) : see reference to
>>>>class template instantiation 'FOO<float,2,3>' being compiled
>>>> G:\bin\TenplateRecurssion\main.cxx(24) : see reference to
>>>>class template instantiation 'FOO<float,3,2>' being compiled
>>>>Error executing cl.exe.
>>>>
>>>>TenplateRecurssion.exe - 1 error(s), 0 warning(s)
>>>>
>>>>
>>>>Note the transposition of 3,2 and 2,3.
>>>>
>>>>The line with the "THIS" label is the one that triggers the compilation error.
>>>>
>>>>As you pointed out, it seems that we are missing to use some
>>>>mechanism for forcing VS6.0 to instantiate the InverseType,
>>>>before we attempt to use a trait from it.
>>>>
>>>>...still looking into it...
>>>>
>>>>
>>>>
>>>> Luis
>>>>
>>>>
>>>>
>>>>
>>>>--------------------------------------------------------------------------
>>>>On Thu, Apr 9, 2009 at 9:33 AM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>>>>
>>>>>Starting up my Visual Studio 6.0 compiler...
>>>>>
>>>>>It's going to be long morning...
>>>>>
>>>>>
>>>>>
>>>>> Luis
>>>>>
>>>>>
>>>>>-----------------------
>>>>>Tom Vercauteren wrote:
>>>>>
>>>>>>Hi all,
>>>>>>
>>>>>>The dashboard is giving me the following error on visual 6 compiler:
>>>>>>
>>>>>>c:\Dashboards\My
>>>>>>Tests\InsightContinuous\Code\Common\itkTransform.h(120) : error C2027:
>>>>>>use of undefined type 'Transform<double,3,2>'
>>>>>>
>>>>>> c:\Dashboards\My
>>>>>>Tests\InsightContinuous\Code\Common\itkTransform.h(120) : see
>>>>>>reference to class template instantiation 'itk::Transform<double,2,3>'
>>>>>>being compiled
>>>>>> c:\Dashboards\My
>>>>>>Tests\InsightContinuous\Code\Common\itkRigid3DPerspectiveTransform.h(42)
>>>>>>: see reference to class template instantiation
>>>>>>'itk::Transform<double,3,2>' being compiled
>>>>>> c:\Dashboards\My
>>>>>>Tests\InsightContinuous\Code\Common\itkTransformFactory.h(37) : see
>>>>>>reference to class template instantiation
>>>>>>'itk::Rigid3DPerspectiveTransform<double>' being compiled
>>>>>> c:\Dashboards\My
>>>>>>Tests\InsightContinuous\Code\Common\itkTransformFactory.h(36) : while
>>>>>>compiling class-template member function 'void __cdecl
>>>>>>itk::TransformFactory<class itk::Rigid3DPerspectiveTransform<double>
>>>>>>
>>>>>>>::RegisterTransform(void)'
>>>>>>
>>>>>>
>>>>>>http://www.cdash.org/CDash/viewBuildError.php?buildid=309403
>>>>>>
>>>>>>Can anyone help me understand what this means?
>>>>>>
>>>>>>I initially thought that this might be related to explicit
>>>>>>instantiation since itk::Transform<double,3,2> is not listed in:
>>>>>>
>>>>>>http://www.itk.org/cgi-bin/viewcvs.cgi/Wrapping/ExplicitITK/Modules/Common/wrap_itkTransform.cmake?root=Insight&sortby=date&view=markup
>>>>>>
>>>>>>Note that I am not even sure that wrap_itkTransform.cmake is the
>>>>>>correct file to look at since I have never worked with explicit
>>>>>>instantiations within ITK before and since I can't manage to compile
>>>>>>ITK with explicit instantiations turned on on my machine.
>>>>>>
>>>>>>Also it seems that dash13 is not using explicit instantiations:
>>>>>>http://www.cdash.org/CDash/testDetails.php?test=20260566&build=308626
>>>>>>
>>>>>>Thanks for your help.
>>>>>>
>>>>>>Tom
>>>>>>_______________________________________________
>>>>>>Powered by www.kitware.com
>>>>>>
>>>>>>Visit other Kitware open-source projects at
>>>>>>http://www.kitware.com/opensource/opensource.html
>>>>>>
>>>>>>Please keep messages on-topic and check the ITK FAQ at:
>>>>>>http://www.itk.org/Wiki/ITK_FAQ
>>>>>>
>>>>>>Follow this link to subscribe/unsubscribe:
>>>>>>http://www.itk.org/mailman/listinfo/insight-developers
>>>>>>
>>>>>
>>>>_______________________________________________
>>>>Powered by www.kitware.com
>>>>
>>>>Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>>>
>>>>Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ
>>>>
>>>>Follow this link to subscribe/unsubscribe:
>>>>http://www.itk.org/mailman/listinfo/insight-developers
>>>>
>>>
>
More information about the Insight-developers
mailing list