为什么我的某些数据成员"expression must be an lvalue or a function designator"收到此错误?
Why do I get this error "expression must be an lvalue or a function designator" for some of my data members?
我正在尝试创建一个函数,该函数从我创建的类中打印出任何我喂养的功能。我只能让一些我的类对象数据成员使用我的打印功能。
我尝试在我在网上找到的某些源代码中使用指针和参考,但它们没有起作用。解决这个问题大约一个星期后,我觉得我已经尝试了所有事情。
void print(string* object);
enum Degree { SECURITY = 1, NETWORKING = 2, SOFTWARE = 3};
class Student {
public:
Student(string ID, string first, string last, string Email, int Age, int days1, int days2, int days3, Degree StudentDegree) {
studentID = ID;
firstName = first;
lastName = last;
email = Email;
age = Age;
daysTillComplete[0] = { days1 };
daysTillComplete[1] = { days2 };
daysTillComplete[2] = { days3 };
studentDegree = StudentDegree;
return;
}
string getID() const;
void setID(string ID);
string getFirst() const;
void setFirst(string ID);
string getLast() const;
void setLast(string ID);
string getEmail() const;
void setEmail(string ID);
int getAge() const;
void setAge( int Age);
int getdays1();
int getdays2();
int getdays3();
void setDaysTilComplete(int days, int days1, int days2);
Degree getDegree() const;
void setDegree(Degree degreeType);
private:
string studentID = "No name";
string firstName = "No name";
string lastName = "No name";
string email = "No name";
int age = 7;
int daysTillComplete[3];
Degree studentDegree = NETWORKING;
};
void print(string* object) {
cout << *object << endl;
}
string Student::getID() const {
return studentID;
}
string Student::getFirst() const {
return firstName;
}
string Student::getLast() const {
return lastName;
}
string Student::getEmail() const {
return email;
}
int Student::getAge() const {
return age;
}
int Student::getdays1() {
return daysTillComplete[0];
}
int Student::getdays2() {
return daysTillComplete[1];
}
int Student::getdays3() {
return daysTillComplete[2];
}
Degree Student::getDegree() const {
return studentDegree;
}
void Student::setID(string ID) {
studentID = ID;
}
void Student::setFirst(string first) {
firstName = first;
}
void Student::setLast(string last) {
lastName = last;
}
void Student::setEmail(string Email) {
email = Email;
}
void Student::setAge(int studentAge) {
age = studentAge;
}
void Student::setDaysTilComplete(int days1, int days2, int days3) {
daysTillComplete[0] = days1;
daysTillComplete[1] = days2;
daysTillComplete[2] = days3;
}
void Student::setDegree(Degree degreeType) {
studentDegree = degreeType;
}
int main() {
Student vallery("A1", "Vallery", "Williams", "vallery.a.williams1234@gmail.com",21,52,28,32,NETWORKING);
print(&vallery.getID());
print(&vallery.getFirst());
print(&vallery.getLast());
print(&vallery.getEmail());
//print(&vallery.getAge()); <--- will not compile if this statement is in the program
//print(&vallery.getdays1()); <--- will not compile if this statement is in the program
////print(&vallery.getdays2()); <--- will not compile if this statement is in the program
////print(&vallery.getdays3()); <--- will not compile if this statement is in the program
//print(&vallery.getDegree()); <--- will not compile if this statement is in the program
cin.get();
return 0;
}
我的预期结果例如打印(vallery.getFirst(;将是打印的瓦利里。这有效,但是当我打印时(vallery.getage(;它应该是21,但我什至无法编译,因为我得到"表达式必须是L值或功能指定器"错误。同样,将int代替字符串用于打印功能的数据类型也不起作用。我必须错误地使用一些东西。有人可以将我指向正确的方向吗?经过一大堆研究,我没有找到任何解决方案。
此代码可能有几件事出现问题。
最明显的是您的打印功能期望string*
。失败的呼叫是您尝试给出函数不是string*
的呼叫。例如,getAge()
返回一个INT,您正在返回返回的INT的地址。因此,您正在尝试调用打印(INT*(,然后失败。为了解决此问题,您可以使用模板或过载。这是推荐的模板功能:
template <typename T>
print (const T& _object)
{
cout << _object << endl;
}
第二个问题,这是掩盖第一个错误的原因来自您正在使用PTR而不是参考(或我的模板函数中的const引用(。如果要打印某些东西,则希望它绝对可以在那里而不是nullptr
。因此,请使用参考。在这么说时,我认为您说的那些会起作用的人绝对不应该在任何理智的编译器下(即使是字符串*(。也许当前的错误是隐藏这些错误。
错误"表达式必须是lvalue或功能指定器" 来自您试图获取R值地址的事实。这是暂时和/或尚未绑定到名称的值。您的Getters返回存储在您的学生对象中的值的副本,此值没有地址。您正在尝试获取无所求的价值的地址,因此必须是LVALUE的错误。
解决这个问题:首先不要使用指针,请使用const引用。其次,让您的Getters返回对象的const参考。例如,
const string& Student::getID() const;
如果您的打印功能采用const引用,则可以在返回int
或其他原始类型的情况下处理临时变量。由于您的其他Getters返回对可寻址值的引用,因此打印功能也可以获取此引用,而无需不必要复制该值。
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- Confusion: decltype vs std::function
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 传递给std::function template的template参数究竟代表什么
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- "no matching function for call to 'Vector::Vector'"错误
- 如何在向量中删除 std::function<void()>?
- 不断"Attempting to reference a deleted function"
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 为什么我的某些数据成员"expression must be an lvalue or a function designator"收到此错误?
- 获取此地址时出现"expression must be an l-value or function designator"错误
- 传递对象地址时"Address expression must be an lvalue or a function designator"