加密模板模板参数错误

Vit*_*meo 4 c++ templates types typename c++11

我正在尝试创建一个从a std::map或an 获取键的函数std::unordered_map。我可以使用简单的重载,但首先我想知道这段代码有什么问题。

template<typename K, typename V, template<typename, typename> class TContainer>  
std::vector<K> getKeys(const TContainer<K, V>& mMap)
{
    std::vector<K> result;
    for(const auto& itr(std::begin(mMap)); itr != std::end(mMap); ++itr) result.push_back(itr->first);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

当使用调用它时std::unordered_map,即使手动指定所有模板类型名称,clang ++ 3.4 也会说:

template template参数的模板参数与其对应的模板template参数不同。

asc*_*ler 5

问题是,std::map并std::unordered_map没有实际上的模板有两个参数。他们是:

namespace std {
    template <class Key, class T, class Compare = less<Key>,
              class Allocator = allocator<pair<const Key, T>>>
    class map;

    template <class Key, class T, class Hash = hash<Key>,
              class Pred = equal_to<Key>,
              class Allocator = allocator<pair<const Key, T>>>
    class unordered_map;
}
Run Code Online (Sandbox Code Playgroud)

这确实有效:

template <typename K, typename... TArgs, template<typename...> class TContainer>
std::vector<K> getKeys(const TContainer<K, TArgs...>& mMap)
{
    std::vector<K> result;
    for (auto&& p : mMap)
        result.push_back(p.first);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我想要的版本:

template <typename Container>
auto getKeys2(const Container& mMap) -> std::vector<typename Container::key_type>
{
    std::vector<typename Container::key_type> result;
    for (auto&& p : mMap)
        result.push_back(p.first);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

同时使用这两个功能的演示程序:http : //ideone.com/PCkcu6