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

C++ 无法解释无法比较C+中的字符串+;模板内,c++,string,templates,C++,String,Templates,我拿到标准了 错误C2678:二进制“==”:未找到接受类型为“std::string”的左侧操作数的运算符(或没有可接受的转换) 错误。然而,我已经包括了字符串,我没有明显的方法来解释这一点 这是我的密码 #include <string> #include <vector> #include <type_traits> // [...] template <typename T> class Graph { private: // [

我拿到标准了

错误C2678:二进制“==”:未找到接受类型为“std::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;
    }
}
#包括
#包括
#包括
// [...]
模板
类图{
私人:
// [...]
结构顶点{
T名称;
// [...]
};
向量顶点;
公众:
// [...]
模板
int顶点(P项){
if(std::is_same::value){
for(无符号整数i=0;i

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

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

更新:
另一种猜测是,
X
被实例化为
int
double
,因为如果它被实例化为
std::string
,编译器会抱怨试图将
std::string
转换为
int
,方法是在
Graph::vertex()
成员函数中返回它

似乎您只需要两个
vertex
方法,如下所示(无模板):

int顶点(常数T&item){
for(无符号整数i=0;i
如果
t
结果是
int
,这将不起作用,但这似乎也不太可能适用于原始代码


上述方法也无法实现默认的
vector(SomeOtherType)
情况,返回默认的-1。它将无法编译,这在我看来是合理的。YMMV.

如果
p
不是字符串,您的代码将失败。C++不是动态语言——编译时对代码进行评估。当
P
int
时,您为这种情况做了准备,表明您期望这种可能性。但是在这种情况下,代码将无法编译,因为您仍然将它与字符串进行比较。我的印象是C++在编译时可以根据推理来切换分支。@ PythonNut,<代码>如果在运行时作出决定。这不是条件编译。在本例中,条件是一个编译时值,但在运行时仍然使用它。那么链接问题中的代码是否无效?基本上
P
,我的方法完全错了?我希望
std
能用宏或其他东西实现一些魔力。。。哦,好吧。不,C++如果运行时<代码>不会切换分支。您需要使用诸如
std::enable_if
之类的元编程工具来完成您试图完成的任务
verts[i]
属于
Vertex
,但是
verts[i]类型。name
可能属于
std::string
类型。非常抱歉,请编辑问题以指定Vertex的结构。我不确定此参数是否仍然适用。。。因为LHS和RH都是类型
std::string
。我发现这和一些模板参数推断完全符合我最初的想法。谢谢
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;
}