0

是否有可能做这样的事情:

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 方法),但问题更多的是是否可以使用模板语法来实现这样的事情。

4

1 回答 1

2

我确信这是有效的,只要在模板实例化时所有必要的定义都可用,而且它肯定对我有用。

你包括<map>吗?您可能还需要包含<functional>for std::less,尽管我确信它必须包含在<map>.

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

如果这些都不是问题,请提供一个最小的、完整的示例来演示问题、确切的错误消息以及它所引用的代码行,并让我们知道您正在使用哪个编译器。

于 2012-04-17T12:17:55.087 回答