无法在模板中比较C++字符串的原因

Unexplained inability to compare string in C++ within templates

本文关键字:字符串 C++ 比较      更新时间:2023-10-16

我得到了标准

错误 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位。

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

更新:

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

似乎您只需要两个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。它只是无法编译,这对我来说似乎是合理的。扬子晚报.