我正在获得标准
错误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位。
答案 0 :(得分:2)
在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()
。
答案 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。