无法在模板中比较C++字符串的原因
Unexplained inability to compare string in C++ within 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位。
做出有根据的猜测,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 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。它只是无法编译,这对我来说似乎是合理的。扬子晚报.