tags:

views:

65

answers:

2

hello.

I have ran into yet another problem I do not understand.

The following does not instantiate (argument instantiation fails), why?

template<class E>
void operator[](typename boost::mpl::identity<E>::type e) const;

thank you for your help

A: 

That seems awfully redundant. identity<E>::type is guaranteed to be equivalent to E, so why not just declare your template as:

template<class E>
void operator[](E e) const;
Blair Holloway
curiosity, also potential to replace identity with "filter" sfinae
aaa
Can you post the exact compiler errors that you're receiving?
Blair Holloway
there is not error perse because of sfinae
aaa
+8  A: 

identity can be used to force you to specify the template argument explicitly. It effectively prevents that function parameter from partaking in template argument deduction.

A qualified type name is one of the non deduced contexts; that is, identity<E>::type will not be used to deduce the template parameter for E.

For example, if you have:

template<class E>
void f(typename boost::mpl::identity<E>::type e) { }

f(42);      // won't work
f<int>(42); // works
James McNellis
thanks, I think makes to me with example you provide
aaa