return语句出现‘expression cannot be used as a function’错误原因排查
问题原因与修复方案
嘿,这个错误的根源其实特别清楚:std::pair里的second是成员变量,不是成员函数,所以你完全没必要(也不能)在后面加括号()来“调用”它。
我给你拆解下细节:
vertices.emplace(...)返回的是std::pair<std::map<T, std::set<T>>::iterator, bool>类型的对象- 这个pair里的
second就是一个单纯的bool值:true代表新顶点成功插入,false代表顶点已经存在于map里 - 你写的
.second()是把它当成无参函数来调用,但它根本不是函数,就是个普通变量,直接访问就行
修正后的代码长这样:
template <typename T> bool Graph<T>::addVert(const T& new_vert) { return vertices.emplace( std::piecewise_construct, std::forward_as_tuple(new_vert), std::forward_as_tuple() ).second; // 把后面的()删掉就好 };
可能你之前和某些STL组件搞混了——比如有些迭代器适配器里确实有second()这样的成员函数,但在std::pair这里,first和second都是直接的成员变量,不用加括号。哪怕你先用变量接住这个pair再访问second,加括号一样会报错,因为本质问题没变。
内容的提问来源于stack exchange,提问作者extremely_unwelcome
相关产品推荐
相关产品推荐

