The dreaded VC++ gotchas

I spent a great deal of time working through issues specifically related to my VC6 compiler. Having had to solve these issues myself, it seems proper that I describe them briefly for the benefit of those intending to use my program.

In-line function expansion ( /Ob1 switch )

Typical problem:

I first saw this error when trying to use both write_graphviz and read_graphviz functionality in my code. Notice it is a link error:

 dfs2.obj : fatal error LNK1179: invalid or corrupt file: duplicate 
  comdat "?policies@?$iterator_adaptor@Vconst_iterator@ ... 

Solution:

Select "Project Settings"c:\www.cuj.com/"C/C++" Tab/"Optimization" Category, and change from (default) "Disable" to "Only _inline". While in the dialog, take out Settings/"C/C++"c:\www.cuj.com/Debug Info:Program Database for "Edit & Continue", to avoid D2016 : 'c:\www.cuj.com/ZI' and 'c:\www.cuj.com/Ob1' that command-line options are incompatible.

Memory allocation limit ( /Zm switch )

At various times as I used different graph algorithms, I would get C1076: "compiler limit : internal heap limit reached." This has to be added directly to the C/C++ Preprocessor scroll window (for example, /Zm200).

Lack of Koenig lookup

The lack of Koenig lookup in VC6 shows up in different guises (see references). For example, in one line of my code:

std::transform(startEI,endEI,
               std::back_inserter(vSignals),
               GetSignalFunctor(_g));

  Missing std:: in transform causes error C2667: 'transform' : none
     of 2 overload have a best conversion 
  Missing std:: in back_inserter causes fatal error C1001: INTERNAL
     COMPILER ERROR 

This also points to the need for incremental build/compile because multiple errors can occur in a line of template call.

Inadvertent mixing up edges and vertices in parameters

When property_maps are used, sometimes passing the wrong type (edge instead of vertex, or vice versa) will cause a fatal error C1001: INTERNAL COMPILER ERROR. Example :

_EdgeAttrMap[v]["label"]=signal; // edge accessed with vertex