[vtk-developers] VTK_LEGACY =>invalid redeclaration of nested class and 2952d8f7bce83e318a233048606b14997b4991a1

Brad King brad.king at kitware.com
Mon Jan 14 11:45:26 EST 2013


On 01/14/2013 10:17 AM, Eric Chamberland wrote:
> Now I have this warning from Intel compiler:
> |
> icpc -o ...
> 
>   /opt/VTK/include/vtk-5.10/vtkActor.h(158): warning #1170: invalid 
> redeclaration of nested class
>      VTK_LEGACY(virtual vtkActor *GetNextPart());
>      ^

As you discovered the macro was added here:

 http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=29b6e700

but it did not include the nested class declaration.  That
was added 7 years ago here:

 http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=1e4cb155

with commit message:

 COMP: When VTK_LEGACY_REMOVE is defined then VTK_LEGACY needs to
 replace methods with dummy declarations to avoid stray semicolons.
 This allows building with Borland when removing legacy code.
 It also avoids warnings on some other compilers.

The code added by that commit is still present:

 #if defined(VTK_LEGACY_REMOVE)
   // Remove legacy methods completely.  Put a bogus declaration in
   // place to avoid stray semicolons because this is an error for some
   // compilers.  Using a class forward declaration allows any number
   // of repeats in any context without generating unique names.
 # define VTK_LEGACY(method) class vtkLegacyMethodRemoved

The comment explains why it works that way.

What was missed, and what is not stated very clearly in the
Intel diagnostic message, is explained by Intel here:

 http://software.intel.com/en-us/articles/cdiag1170
 "This diagnostic is issued if you redeclare a nested class
  with different accessibilities."

So we will see this when more than one method is deprecated AND
they have different access levels (public/protected/private).

Try changing the macro definition to this:

 # define VTK_LEGACY(method)         VTK_LEGACY__0(method,__LINE__)
 # define VTK_LEGACY__0(method,line) VTK_LEGACY__1(method,line)
 # define VTK_LEGACY__1(method,line) class vtkLegacyMethodRemoved##line

to add a file-wise unique number to each declaration.

-Brad



More information about the vtk-developers mailing list