My title might be wrong - if so, please do correct me, but at some point its hard for me to keep track of what meta thingy I'm actually trying to achieve ;)
I have a class function template like this:
template<template<typename...> class MapType>
Expression Expression::substitute(MapType<std::string, Expression> const& identifierToExpressionMap) const {
return SubstitutionVisitor<MapType>(identifierToExpressionMap).substitute(something);
}
The important part is the MapType. The idea is to allow either std::map
or std::unordered_map
to be plugged in at will. With GCC and Clang, this works, but Visual Studio 2013 throws a compilation error:
error C2664: 'Expression Expression::substitute<std::map>(const MapType &) const' : cannot convert argument 1 from 'std::map<std::string,Expression,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'const std::map &' 1> with 1> [ 1> MapType=std::map 1> ] 1> and 1> [ 1> _Kty=std::string 1> , _Ty=Expression 1> ] 1> Reason: cannot convert from 'std::map<std::string,Expression,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'const std::map' 1> with 1> [ 1> _Kty=std::string 1> , _Ty=Expression 1> ] 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
It seems that MSVC does not put MapType
and <std::string, Expression>
together as a type, am I missing something here?
So my question is
- is this possible and just a bug in MSVC, or
- is there an easier way to do this. Please keep in mind that there are many other classes which receive the
MapType
parameter and instantiate their own version with different key/value Types.