我有一个“集”数据类型:

template <class V>
struct Set {
  void add(const V& value) {}
};

我想编写一个顶级功能版本 Set::add.

template <class V>
void add(const Set<V>& set, const V& value) {}

这与字符串文字不完全合作:

Set<const char*> set;
const char* val = "a";

set.add(val); // ok
set.add("a"); // ok

add(set, val); // ok
add(set, "a"); // ERROR
add<const char*>(set, "a"); // ok

错误消息(G ++ 4.2.4):

no matching function for call to ‘add(Set<const char*>&, const char [2])’

看起来与以下事实有关 "a" 有类型 const char[2] 并不是 const char*. 。有人知道如何使它起作用吗?

有帮助吗?

解决方案

问题是 V 获取一种类型的左参数,另一种类型为正确的类型。我怀疑你也想说 add(setOfLong, 0) - 但是使用该模板,您无法。我建议添加一个单独的模板参数来解决此问题

template <class SetV, class V>
void add(const Set<SetV>& set, const V& value) {}

其他提示

还有另一种解决这个问题的方法(忘记了我在哪里看到的...)。

您可以使用“身份”类型包装器具有编译器 不是 执行推理时考虑类型。

template <T>
struct Identity {
   typedef T type;
};

然后定义这样的“添加”:

template <class V>
void add(const Set<V>& set, const typename Identity<V>::Type& value) {}

这导致“ V”仅根据第一个参数类型推导。一旦确定,它就会继续并将其用于第二个参数,该参数正常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top