g++ fails to compile a program that has a template parameter with a boolean expression involving a templated static constant

Solution Unverified - Updated -

Issue

  • g++ fails to compile a program that has a template parameter with a boolean expression involving a templated static constant

  • This problem is seen when the boost library is used in the following manner:

#include <boost/mpl/if.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/vector.hpp>

template < class FieldTypes, class BaseType >
struct PlainTraits
{
  static const std::size_t fields_num = boost::mpl::size< FieldTypes >::value;
  static const std::size_t total_size = fields_num * sizeof( BaseType );

  //enum { can_be_viewed_as_plain = total_size % sizeof( BaseType ) == 0 };
 
  BOOST_MPL_ASSERT( total_size % sizeof( BaseType ) == 0 );
};

PlainTraits< boost::mpl::vector<int,int>, int > x;

  • Uncommenting the line in bold above allows the code to compile.

  • The compilation error for the above code:

test.cpp: In instantiation of 'PlainTraits<boost::mpl::vector<int, int, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, int>':
test.cpp:16:   instantiated from here
test.cpp:13: error: '((((long unsigned int)PlainTraits<boost::mpl::vector<int, int, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, int>::total_size) & 3ul) == 0ul)' is not a valid template argument for type 'bool' because it is a non-constant expression

Environment

  • Red Hat Enterprise Linux 6
  • gcc-4.4
  • boost

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content