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