使用T :: Type typedef来默认模板参数

时间:2012-04-17 11:59:51

标签: c++ templates

是否可以做这样的事情:

template <typename T, typename Comparator = std::less<typename T::Key>>
struct Container
{
    std::map<typename T::Key, T*, Comparator> m;
};

这是问题部分:typename Comparator = std::less<typename T::Key>

即。在T的实现中有一个typedef用于比较器的特化。是否总是需要将比较器使用的东西(T :: Key)指定为模板的显式参数?

我意识到还有其他方法可以通过改变T类来实现(例如需要一个显式的T :: compareKey方法),但问题还在于模板语法是否可以用来实现这样的东西。

1 个答案:

答案 0 :(得分:2)

我确信这是有效的,只要在实例化模板时所有必要的定义都可用,并且肯定works for me.

您是否包括<map>?您可能还需要在<functional>中加入std::less,但我确信<map>必须包含>>

您的编译器是否支持C ++ 11,并且您是否已启用该支持?较旧的编译器(或那些配置为严格遵守C ++ 03的编译器)会因使用{{1}}关闭两个模板参数列表而感到困惑;他们会将其解释为右移运营商。在这种情况下,您可以通过在它们之间添加空格来解决问题。

如果这些都不是问题,请包含一个演示问题的最小完整示例,确切的错误消息,指出它引用的代码行,并让我们知道您正在使用哪个编译器。< / p>