Ok! Thanks! I got it... The problem is, that I thought that SFINAE would work from the template class in the template function which does not depend on the argument. is_const is a member of the traits_class which this type is derived from... Pretty much like: template<class T> struct traits_class { // some type calcs here typedef ... result_type; enum { is_const = false }; }; template<class T> struct traits_class<const T> { // some type calcs here typedef ... result_type; enum { is_const = true }; }; template<class T> struct some_class : traits_class<T> { template<class LookUpType_> typename boost::disable_if_c<is_const, result_type>::type at(LookUpType_ const& key) { return has_key(view_, key); //has key is some external function, which receives the result_type from the view_ } }; My idea was to enable only result_type at(LookUpType_ const& key) const; if T is const OR enable non-const version. result_type at(LookUpType_ const& key); if T is not const On the other hand Compiler does this for me automatically if T is const (but if T is non-const I would like to disable the const access). Anyway in that case I thought SFINAE should work, but it did not. Do I really need a type to be a template param of the member function, even if the class is a template itself? Thanks for your help! Ovanes On 10/31/07, David Abrahams <dave@boost-consulting.com> wrote:
on Tue Oct 30 2007, "Ovanes Markarian" <om_boost-AT-keywallet.com> wrote:
Hello!
Does anybody else experience a problem using enable_if templates in Visual C++ Express 2005 SP1? I get compiler errors in this code:
template<class LookUpType_> typename boost::enable_if_c<is_const, result_type>::type at(LookUpType_ const& key)const { return has_key(view_, key); }
template<class LookUpType_> typename boost::disable_if_c<is_const, result_type>::type at(LookUpType_ const& key) { return has_key(view_, key); }
It blames that type is not a member of enable_if_c or disable_if_c? This is really strance, since this should not be considered by compiler as a possible template instantiation. is_const is an enum value containing either true or false.
In order for SFINAE to work, at least one argument to [dis|en]able_if has to depend on a template argument (in this case, LookUpType_ is the only one). As written, none of them do.
I don't know what you're doing with is_const, but at least in the Boost world that is a template that requires a template argument in that context. For example,
template<class LookUpType_> typename boost::disable_if_c<boost::is_const<LookUpType_>, result_type>::type at(LookUpType_ const& key) { return has_key(view_, key); }
HTH,
-- Dave Abrahams Boost Consulting http://www.boost-consulting.com
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users