Samuel Charron wrote:
Hi,
I'm currently using the apply metafunction, and I have two different behaviors depending on the used compiler.
<snip code>
With g++ 4.1, there is no error. With g++ 4.2, icc 9.1, an error occurs:
I can't verify, but I believe it's might be:
- g++ : no class template named 'apply' in 'class std::tr1::unordered_set<mpl_::arg<1>, std::equal_to<int>, std::tr1::hash<int>, std::allocator<int>, false>' ^^^^^^
Placeholder substitution won't work in argument lists of templates with non-type parameters (well, sometimes it does work, but only if there is a default and if the compiler deduces template template arguments in a certain, probably non-standard way).
Can you give me some help to make this work ?
To work around this limitation, you can use a custom Metafunction template<typename T> struct specialize_unordered_set { typedef std::tr1:unordered_set<T> type; }; and then use it in a Placeholder Expression. Alternatively (this way might save you some compile time), you can write a Metafunction Class to replace the Placeholder Expression: struct specialize_unordered_set { template<typename T> struct apply { typedef std::tr1::unordered_set<T> type; }; }; HTH. Regards, Tobias