我已经四处搜寻,发现了诸如this one或that one之类的问题,但似乎没有一个问题与我相同。搜索错误(no match for ‘operator=’
)和注释(no known conversion for argument 1
)会产生很少的结果。
我正在构建一个Datalog解析器,并且Parameter和Expression的类需要彼此作为成员。我认为我已经正确实现了前向声明,但是那里仍然可能有问题。下面,我已尽力减少了错误。
parameter.h
#ifndef PARAMETER_H
#define PARAMETER_H
#include <iostream>
#include <string>
#include <vector>
class Expression;
class Parameter {
public:
explicit Parameter(std::string&);
explicit Parameter(Expression*);
std::string str;
Expression* e;
friend std::ostream& operator<<(std::ostream&, const Parameter&);
};
class Expression {
public:
Expression(Parameter&, std::string&, Parameter&);
Parameter l;
std::string op;
Parameter r;
friend std::ostream& operator<<(std::ostream&, const Expression&);
};
#endif // PARAMETER_H
parameter.cpp
#include "parameter.h"
Parameter::Parameter(std::string& param) : str(param) {}
Parameter::Parameter(Expression* expr) { e = expr; }
std::ostream& operator<<(std::ostream& strm, const Parameter& p) {
if (p.str.empty()) {
// parameter is an expression
strm << *p.e;
} else {
// parameter is ID or STRING
strm << p.str;
}
return strm;
}
Expression::Expression(Parameter& left, std::string& oper, Parameter& right) : l(left), op(oper), r(right) {}
std::ostream& operator<<(std::ostream& strm, const Expression& e) {
strm << "(" << e.l << " " << e.op << " " << e.r << ")";
return strm;
}
main.cpp
#include <iostream>
#include <string>
#include <vector>
#include "parameter.h"
int main() {
std::string sample1 = "word";
std::string sample2 = "another";
std::string sample3 = "yep";
std::vector<std::string> samples;
samples.push_back(sample1);
samples.push_back(sample2);
samples.push_back(sample3);
std::vector<Parameter> params;
params.insert(params.end(), samples.begin(), samples.end());
return 0;
}
我正在使用gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
。使用g++ -Wall -Werror -std=c++17 -g *.cpp
进行编译可以得出以下结果:
In file included from /usr/include/c++/7/bits/char_traits.h:39:0,
from /usr/include/c++/7/ios:40,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from recursiveDescent.h:4,
from recursiveDescent.cpp:1:
/usr/include/c++/7/bits/stl_algobase.h: In instantiation of ‘static _OI
std::__copy_move<false, false,
std::random_access_iterator_tag>::__copy_m(_II, _II, _OI) [with _II =
std::__cxx11::basic_string<char>*; _OI = Parameter*]’:
/usr/include/c++/7/bits/stl_algobase.h:386:44: required from
[...skipped...] required from here
/usr/include/c++/7/bits/stl_algobase.h:324:18: error: no match for ‘operator=’ (operand types are ‘Parameter’ and ‘std::__cxx11::basic_string<char>’)
*__result = *__first;
~~~~~~~~~~^~~~~~~~~~
In file included from predicate.h:8:0,
from datalogProgram.h:8,
from recursiveDescent.h:8,
from recursiveDescent.cpp:1:
parameter.h:10:7: note: candidate: Parameter& Parameter::operator=(const Parameter&)
class Parameter {
^~~~~~~~~
parameter.h:10:7: note: no known conversion for argument 1 from ‘std::__cxx11::basic_string<char>’ to ‘const Parameter&’
parameter.h:10:7: note: candidate: Parameter& Parameter::operator=(Parameter&&)
parameter.h:10:7: note: no known conversion for argument 1 from ‘std::__cxx11::basic_string<char>’ to ‘Parameter&&’
答案 0 :(得分:0)
OP的构造函数Parameter::Parameter(std::string&)
(或者,如PeterT指出的那样,更好的Parameter::Parameter(const std::string&)
)可以(并将)用于将std::string
转换为Parameter
中的>
params.insert(params.end(), samples.begin(), samples.end());
但是OP通过将其设置为explicit
来明确禁止这样做。
我经常将explicit
用于可以用一个参数调用的构造函数,因为我担心意外的转换(并且我想控制自己的代码的幻想)。在这种情况下,放下explicit
可能会更容易。
示例:
#include <iostream>
#include <string>
#include <vector>
class Parameter {
private:
std::string _name;
public:
/*explicit*/ Parameter(const std::string &name): _name(name) { }
const std::string& name() const { return _name; }
};
std::ostream& operator<<(std::ostream &out, const Parameter ¶m)
{
return out << "Parameter '" << param.name() << "'";
}
template <typename T>
std::ostream& operator<<(std::ostream &out, const std::vector<T> &vec)
{
const char *sep = "";
for (const T &elem : vec) {
out << sep << elem;
sep = ", ";
}
return out;
}
int main()
{
const std::vector<std::string> samples({ "word", "another", "yep" });
std::vector<Parameter> params;
params.insert(params.end(), samples.begin(), samples.end());
std::cout << "params: " << params << '\n';
return 0;
}
输出:
params: Parameter 'word', Parameter 'another', Parameter 'yep'