[mpl] How to use not_ with has_trivial_destructor metafunction

Hi there, I have troubles compiling the following code with Visual C++ 2010 and boost 1.52. #include <boost/mpl/not.hpp> #include <boost/type_traits/has_trivial_destructor.hpp> #include <boost/utility/enable_if.hpp> template <typename T> void foo( typename boost::enable_if< boost::mpl::not_< boost::has_trivial_destructor< T > > >::type* /*ptr*/ = 0 ) { int i = 9; } int main(int argc, char* argv[]) { foo< int >(); return 0; } The error I'm getting is: error C2770: invalid explicit template argument(s) for 'void foo(boost::enable_if<boost::mpl::not_<boost::has_trivial_destructor<T>>>::type *)' Can someone see what the problem might be? Thanks, Christian

Hi Christian, Christian Henning wrote:
The error I'm getting is:
error C2770: invalid explicit template argument(s) for 'void
foo(boost::enable_if<boost::mpl::not_<boost::has_trivial_destructor<T>>>::type *)'
Can someone see what the problem might be?
Actually, it looks like the code's working -- you're SFINAEing out foo for types that have a trivial destructor -- which includes int. It works the same in g++4.5 and VC10. Removing the not wrapper allows the code to compile on both -- as it should. Try passing a type with a non-trivial destructor (e.g., std::string) to allow this use to compile. HTH, Nate

Hi Nathan, On Wed, Nov 21, 2012 at 8:15 PM, Nathan Crookston <nathan.crookston@gmail.com> wrote:
Hi Christian,
Christian Henning wrote:
The error I'm getting is:
error C2770: invalid explicit template argument(s) for 'void
foo(boost::enable_if<boost::mpl::not_<boost::has_trivial_destructor<T>>>::type *)'
Can someone see what the problem might be?
Actually, it looks like the code's working -- you're SFINAEing out foo for types that have a trivial destructor -- which includes int. It works the same in g++4.5 and VC10.
Removing the not wrapper allows the code to compile on both -- as it should.
Try passing a type with a non-trivial destructor (e.g., std::string) to allow this use to compile.
Yes, of course, you're correct. Sorry for the noise. What I need to provide is foo function for types that do have a trivial destructor. Happy Turkey Day, Christian
participants (2)
-
Christian Henning
-
Nathan Crookston