无法解释的无法在模板中比较C ++中的字符串

时间:2014-05-18 00:11:09

标签: c++ string templates

我正在获得标准

  

错误C2678:二进制' ==' :找不到哪个运算符采用了类型为' std :: string'的左手操作数。 (或者没有可接受的转换)

错误。但是,我已经包含了string,而且我没有明显的解释方法。

这是我的代码。

#include <string>
#include <vector>
#include <type_traits>

// [...]
template <typename T>
class Graph {
private:
    // [...]
    struct Vertex {
        T name;
        // [...]
    };
    std::vector<Vertex> verts;
public:
    // [...]
    template <typename P>
    int vertex(P item) {
        if (std::is_same<P,T>::value) {
            for (unsigned int i = 0; i < verts.size(); i++){
                if (verts[i].name == item) {
                    return i;
                }
            }
        } else if (std::is_same<P,int>::value) {
            return item;
        }
        return -1;
    }
}

编译器是VS2012,平台是Windows 8.1 64位。

2 个答案:

答案 0 :(得分:2)

if (verts[i].name == item)中进行有根据的猜测似乎verts[i].name已被实例化为std::stringitem尚未实例化为std::string 。因此,编译器正确地抱怨没有重载运算符来比较std::stringX

更新

另一个猜测是X被实例化为intdouble,因为如果它被实例化为std::string,编译器会抱怨尝试转换通过std::string成员函数返回intGraph::vertex()

答案 1 :(得分:1)

好像你只需要两个vertex方法,就像这样(没有模板):

int vertex(const T& item) {
  for (unsigned int i = 0; i < verts.size(); i++){
    if (verts[i].name == item) {
      return i;
    }
  }
}

int vertex(int item) {
  return item;
}

如果T原来是int,则无法使用,但这似乎也不适用于原始代码。

以上也无法实现默认的vector(SomeOtherType)情况,因为返回默认值为-1。它只是无法编译,这对我来说似乎是合理的。 YMMV。