以ä¸ã®ã³ã¼ããVisual C++ 12.0ã§ã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªãã¾ããBoostã®ãã¼ã¸ã§ã³ã¯1.55ã§ãã
#include <boost/iterator/iterator_concepts.hpp> int main() { }
åºå http://melpon.org/wandbox/permlink/oJdAALJZbyRJgIiG
iterator_concepts.hpp(43): error C2448: 'BOOST_concept' : é¢æ°ã®å®ç¾©ãééã£ã¦ãã¾ãã
ãã®è¾ºããè¦ãæããBOOST_concept
ãã¯ãå±éãæªããããªã®ã§ã/EP
ã³ã³ãã¤ã©ãã·ã§ã³ãã¤ãã¦ãã¯ããå±éããã½ã¼ã¹ã³ã¼ãããã§ãã¯ãã¦ã¿ã¾ããã
ãã¯ãå±éããã½ã¼ã¹ã³ã¼ãã®ä¸é¨æç²
namespace boost_concepts { BOOST_concept(ReadableIterator,(Iterator)) : boost::Assignable<Iterator> , boost::CopyConstructible<Iterator> { typedef typename boost::detail::iterator_traits<Iterator>::value_type value_type; typedef typename boost::detail::iterator_traits<Iterator>::reference reference; enum { boost_concept_check50 = sizeof(::boost::concepts::require_((void(*)(boost::concepts::usage_requirements<ReadableIterator>))0)) }; ~ReadableIterator() { value_type v = *i; boost::ignore_unused_variable_warning(v); } private: Iterator i; };
BOOST_conceptãå±éããã¦ãã¾ããã§ãããå®ç¾©ããã¦ãã使ç¨ãããã¾ã§ã®éã«undef
ããã¦ãã¾ã£ã¦ããããã§ããããããã½ã¼ã¹ã³ã¼ããè¦ã¦ã
<boost/iterator/iterator_concepts.hpp> â <boost/concept_check.hpp> BOOST_concept defineããã â BOOST_concept undefããã <boost/concept_check.hpp>ããã â BOOST_concept defineããã â BOOST_conceptä½¿ç¨ â BOOST_concept undefããã â <boost/iterator/iterator_concepts.hpp>ããã
ã¨ãundefããã¦ããããã«è¦ããªããã§ãããâ¦
ããããã¦ä¸åº¦undefãã¦ãã¾ãã¨ãå度defineãã¦ãundefãããã¾ã¾ã¨è¦ãªãã¦å±éãã¦ãããªããããªããã»ããµã®ä¸å ·åã§ã¯ãªããã¨æã£ãã®ã§ããã
#define A typename T #undef A #define A typename T template < A > struct hoge {}; #undef A int main() { hoge<int> h; }
ãæ®éã«åããã®ã§ããã¯ãªãããã§ãã Visual C++ã§ã¯<boost/concept/detail/concept_undef.hpp>ã®ã
# undef BOOST_concept_typename # undef BOOST_concept
ãã³ã¡ã³ãã¢ã¦ããããããããã¯<boost/concept_check.hpp>ã®ä¸çªæå¾ãã3è¡ç®ã1082è¡ç®ã®
# include <boost/concept/detail/concept_undef.hpp>
ãã³ã¡ã³ãã¢ã¦ããããã¨ã§ãæåã®ã½ã¼ã¹ã³ã¼ãã®ã³ã³ãã¤ã«ãéãã¾ãã
æ¬å½ã®åå ã¯çµå±ãããã¾ããã§ããã
ã¡ãªã¿ã«clangã¨gccã¯æåã®ã½ã¼ã¹ã³ã¼ãã®ã³ã³ãã¤ã«éãã¾ãã(gccã¯è¦åãããããåºã¾ãã)