【发布时间】:2015-02-04 15:25:09
【问题描述】:
我有一个类需要使用某种地图。默认情况下,我想使用std::map,但我也想让用户能够根据需要使用不同的东西(例如std::unordered_map,甚至可能是用户创建的)。
所以我的代码看起来像
#include <map>
template<class Key, template<class, class> class Map = std::map>
class MyClass {
};
int main() {
MyClass<int> mc;
}
但是,g++ 抱怨
test.cpp:3:61: error: template template argument has different template parameters than its corresponding template template parameter
template<class Key, template<class, class> class Map = std::map>
^
test.cpp:8:14: note: while checking a default template argument used here
MyClass<int> mc;
~~~~~~~~~~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/map:781:1: note: too many template parameters in template template argument
template <class _Key, class _Tp, class _Compare = less<_Key>,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:3:21: note: previous template template parameter is here
template<class Key, template<class, class> class Map = std::map>
^~~~~~~~~~~~~~~~~~~~~~
1 error generated.
所以看起来g++ 不高兴std::map 有默认参数。
有没有办法让Map 成为任何可以接受至少两个模板参数的模板?
如果可以的话,我更愿意坚持使用 C++98,但我对 C++11 持开放态度。
【问题讨论】:
-
如果你对 C++11 持开放态度,你可以说
template <typename...> class Map = std::map,但真正的解决方案是在类型上参数化,而不是在模板上。 -
@KerrekSB 我最初是这样做的,但我需要 Map
和 Map 。我也有这些的默认模板参数,但我认为如果用户可以只指定 Map 并且如果他们没有指定 Map 或 Map 会很方便,这些将自动确定.有没有更好的方法来避免模板模板参数?