This documentation is archived and is not being maintained.

Summary of Compile-Time Breaking Changes

This topic summarizes the compile-time errors and warnings that will now be issued on code that compiled without errors or warnings prior to Visual C++ 2003. However, some conformance-related, compile-time breaking changes were introduced in Visual C++ 2005.

  • Closing parentheses now required for the defined preprocessor directive (C2004).

  • Missing typename keyword and explicit specializations no longer find template parameters from primary template (C2146 ).

  • A protected member (n) can only be accessed through a member function of a class (B) that inherits from the class (A) of which it (n) is a member (C2247).

  • Improved accessibility checks in compiler now detect inaccessible base classes (C2247).

  • An explicit specialization can not be a copy constructor or copy assignment operator (C2299).

  • An exception cannot be caught if the destructor and/or copy constructor is inaccessible (C2316).

  • Default arguments on pointers to functions no longer allowed (C2383).

  • A static data member cannot be initialized via derived class (C2477).

  • The initialization of a typedef is not allowed by the standard and now generates a compiler error (C2513).

  • bool is now a proper type (C2632).

  • A UDC can now create ambiguity with overloaded operators (C2666).

  • A qualification conversion is not the same as identity conversion (C2666).

  • More expressions are now considered valid null pointer constants (C2668).

  • template<> is now required in places where the compiler would previously infer it (C2768).

  • The explicit specialization of a member function outside the class is not valid if the function has already been explicitly specialized via a template class specialization. (C2910).

  • For every explicit specialization, you must chose the parameters of the every explicit specialization, such that, they match the parameters of the primary template (C2912).

  • Floating point non-type template parameters are no longer allowed (C2993).

  • Class templates are not allowed as template type arguments (C3206).

  • Friend function names are no longer introduced into containing namespace (C3767).

  • Enhanced pointer-to-member conformance (C3867).

  • The compiler will no longer accept extra commas in a macro (C4002).

  • An object of POD type constructed with an initializer of the form () will be default-initialized (C4345).

  • typename is now required if a dependent name is to be treated as a type (C4346).

  • Functions that were incorrectly considered template specializations are no longer considered so (C4347).

  • Static data members cannot be initialized via derived class (C4356).

  • A class template specialization needs to be defined before it was used in a return type (C4686).

  • The compiler now reports unreachable code (C4702).

  • A friend declaration that declares a new non-template function must be defined (LNK2019).