[Insight-developers] fixed Visual C++ ICE on NeighborhoodOperator
Joshua Cates
cates@cayenne.cs.utah.edu
Fri, 23 Feb 2001 18:58:10 -0700 (MST)
Amazing, I'm shaking in my chair! Thanks Brad.
Josh.
______________________________
Josh Cates
School of Computer Science
University of Utah
Email: cates@cs.utah.edu
Phone: (801) 587-7697
URL: www.cs.utk.edu/~cates
On Fri, 23 Feb 2001, Brad King wrote:
> Hello, all:
>
> Will asked me to take a look at the INTERNAL COMPILER ERROR that
> Visual C++ has been producing when building Josh's
> itk::NeighborhoodOperator class. I have no explanation for why this
> happens, other than a bug in the compiler, but I managed to reduce the
> problem to a simple example.
>
> The first of the following four examples cause the problem, but the other
> three don't, despite very minor differences.
>
> ---------------------------------------------------------------------------
> // This version results in the INTERNAL COMPILER ERROR.
> namespace N { class A {}; }
> class B { void f(N::A); };
> template <int V> class C {}; // ICE here, on the ">" after "int V".
> ---------------------------------------------------------------------------
> // Template parameter of class C a typename instead of value.
> namespace N { class A {}; }
> class B { void f(N::A); };
> template <typename T> class C {};
> ---------------------------------------------------------------------------
> // Inline implementation of function B::f.
> namespace N { class A {}; }
> class B { void f(N::A) {} };
> template <int V> class C {};
> ---------------------------------------------------------------------------
> // Function B::f's parameter is not a name from another namespace.
> class A {};
> class B { void f(A); };
> template <int V> class C {};
> ---------------------------------------------------------------------------
>
> This problem existed in the NeighborhoodOperator and several other
> classes. The reason was that the protected coefficient manipulation
> functions used "std::vector<TPixel>" as an argument type:
>
> template< class TPixel, unsigned int VDimension >
> class ITK_EXPORT NeighborhoodOperator : public Neighborhood<TPixel,
> VDimension>
> {
> ...
> protected:
> ...
> virtual void FillCenteredDirectional(const std::vector<TPixel> &);
> ...
> };
>
> This corresponds to the "void f(N::A)" part of the above example
> (N = std, A = vector<TPixel>).
>
> Then, the .txx part of the source is included right after the class
> definition (since ITK_MANUAL_INSTANTIATION is not defined). This
> begins with the code:
>
> template<class TPixel, unsigned int VDimension>
> void
> NeighborhoodOperator<TPixel, VDimension>
> ::CreateDirectional()
> {
> ...
> }
>
> The template<...> line includes an argument with an integral type. This
> corresponds to the "template <int V> class C{};" part of the example
> (int V = unsigned int VDimension).
>
> I have gone through all the classes in Code/Common that have this problem
> and added "typedef std::vector<TPixel> CoefficientVector;" so that
> the functions could use the name "CoefficientVector", which solves the
> INTERNAL COMPILER ERROR problem and is more descriptive anyway.
>
> These changes were checked in a few minutes ago. If anyone encounters
> this problem again, refer to this email for the solution.
>
> -Brad
>
>
>
> _______________________________________________
> Insight-developers mailing list
> Insight-developers@public.kitware.com
> http://public.kitware.com/mailman/listinfo/insight-developers
>