RE: [Boost-Users] Problem with BOOST_STATIC_ASSERT
Some further follow-up on this. I've created a minimal program that exhibits the new problem behavior: /******************************************/ #include <boost/type_traits.hpp> #include <boost/static_assert.hpp> template < typename ValueType > struct A { BOOST_STATIC_ASSERT(boost::is_integral<ValueType>::value); }; extern "C" int main(int argc, char* argv[]) { return 0; } /******************************************/ The fact that this assertion fails is counter-intuitive to me, since there is no instantiation to compile. Note that this behavior seems limited to the use of "is_integral" as the type predicate. Constructing a similar program using "is_POD" behaves as expected: /******************************************/ #include <boost/type_traits.hpp> #include <boost/static_assert.hpp> template < typename ValueType > struct B { BOOST_STATIC_ASSERT(boost::is_POD<ValueType>::value); }; struct C {}; extern "C" int main(int argc, char* argv[]) { // B<int> Bint; /* OK to add */ // B<C> BC; /* causes error */ return 0; } /******************************************/ Here, no error occurs until there is an attempt to instantiate B<C>. Randy Bowen -----Original Message----- From: Randy Bowen Sent: Tuesday, January 07, 2003 1:40 PM To: Boost-Users@yahoogroups.com Subject: [Boost-Users] Problem with BOOST_STATIC_ASSERT I'm in the process of updating some applications from use of Boost 1.28.0 to 1.29.0, using MSVC7. I've noticed that a number of static assertions that used to compile now generate errors. The assertions all use is_integral to perform a type validation - e.g.: BOOST_STATIC_ASSERT(::boost::is_integral<value_type>::value); This produces an error of the form: c:\Perforce\Development\Web\cppinclude\domestic\Application Framework\State Machine Engine\StringSerializer.h(145) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>' with [ x=false ] c:\Perforce\Development\Web\cppinclude\domestic\Application Framework\State Machine Engine\StringSerializer.h(143) : see reference to class template instantiation 'sme::StringSerializer<_StringType,>::StringWriter<<template parameter>>' being compiled c:\Perforce\Development\Web\cppinclude\domestic\Application Framework\State Machine Engine\StringSerializer.h(169) : see reference to class template instantiation 'sme::StringSerializer<_StringType,>' being compiled I believe that the data type is integral, and is complete at compile time. Any known reason why this would happen? Randy Bowen
Some further follow-up on this. I've created a minimal program that exhibits the new problem behavior:
/******************************************/ #include <boost/type_traits.hpp> #include <boost/static_assert.hpp>
template < typename ValueType > struct A { BOOST_STATIC_ASSERT(boost::is_integral<ValueType>::value); };
extern "C" int main(int argc, char* argv[]) { return 0; } /******************************************/
The fact that this assertion fails is counter-intuitive to me, since there is no instantiation to compile. Note that this behavior seems limited to the use of "is_integral" as the type predicate. Constructing a similar program using "is_POD" behaves as expected:
I can reproduce that with both VC6 and VC7, all the other compilers I have access to are OK with it. It's clearly a compiler bug, because the assert is triggered even though no instance of the template class is ever created. Unfortunately I don't have any kind of workaround :-( John Maddock http://ourworld.compuserve.com/homepages/john_maddock/index.htm
participants (2)
-
John Maddock
-
Randy Bowen