类中的函数一直返回错误(将类型void或Student转换为float,或未找到目录)



我试图返回整数和的平均值作为浮点数。我试图保持一切在头,只调用main函数。然而,calculateAverage一直返回错误。

/tmp/ccmVBZhQ.o: In function `Student::calculateAverage()':                     
grade.cpp:(.text._ZN7Student16calculateAverageEv[_ZN7Student16calculateAverageEv
]+0x2f): undefined reference to `std::iterator_traits<__gnu_cxx::__normal_iterat
or<int*, std::vector<int, std::allocator<int> > > >::value_type reduce<__gnu_cxx
::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >(__gnu_cxx::
__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__n
ormal_iterator<int*, std::vector<int, std::allocator<int> > >)'                 
collect2: error: ld returned 1 exit status                                      
./vpl_execution: line 22: ./a.out: No such file or directory                    

我已经想了一个多星期了,我需要一些帮助。我正在尝试为'average'设置float,但在我遇到的其他错误中,包括试图将类型Student或void转换为float。

#include <iostream>
#include <vector>
#include <string>
#include <numeric>
#include <functional>
using namespace std;
template< class InputIt >
typename std::iterator_traits<InputIt>::value_type
reduce( InputIt first, InputIt last );
class College
{
private:
static string principal_name;  // principal_name is common for all the students
public:
static void setPrincipalName(string name)
{
principal_name = name;
}
static string getPrincipalName()
{
return principal_name;
}
};
//Initialize the static principal_name variable with value "John" here
string College::principal_name = "John";

class Student
{
private:
vector<int> gradesVec;
int id,stdId,markElement;
string name,studentName,reqName;
string return1 = "Student Name : ",return2 = "Student ID : ",return3 = "Principal Name : ",return4 = "Average : ",return5 = "Grade : ";
string prompt1 = "Enter Student ID : ",prompt2 = "Enter Student Name : ",prompt3 = "Enter the five subject marks : ";
float average;
char grade;
College cObj;
float marks[5];
public:

void promptID()  {
cout << prompt1 << endl;
}
void promptStdName() {
cout << prompt2 << endl;
}
void promptMarks()  {
cout << prompt3 << endl;
}
void nameRequest()  {
cin >> studentName;
}
void idRequest()    {
cin >> stdId;
}
void reqMarks() {
cin >> markElement;
}
void setMarksVector()   {
gradesVec.push_back(markElement);
}
void getNameRequest()   {

}
void getIdRequest() {

}
void getMarksVector()   {

}
void getStudentDetails();
void calculateAverage() {
average = (reduce(gradesVec.begin(),gradesVec.end())) / (gradesVec.size());
};
void findGrade()    {

}
void displayStudentDetails();
void setId(int id)
{
this->id=id;
}
int getId()
{
return id;
}
void setAverage(float average)
{
this->average=average;
}
int getAverage()
{
return average;
}
void setName(string n)
{
this->name=n;
}
string getName()
{
return name;
}
void setMarks(float m[])
{
for(int i=0; i<4;i++)
this->marks[i]=m[i];
}
float* getMarks()
{
return marks;
}
void setGrade(char g)
{
grade=g;
}
char getGrade()
{
return grade;
}
College getCollegeObject()
{
return cObj;
}
};
int main()  //DO NOT change the 'main' signature
{
//Fill code here

int stdId, grade2;
float grade1, avg;
string studentName,grade;
Student student;
student.promptID();
student.idRequest();
student.setId(stdId);
student.promptStdName();
student.nameRequest();
student.setName(studentName);
student.promptMarks();
student.reqMarks();
student.setMarksVector();
student.reqMarks();
student.setMarksVector();
student.reqMarks();
student.setMarksVector();
student.reqMarks();
student.setMarksVector();
student.reqMarks();
student.setMarksVector();
student.calculateAverage();

student.setId(stdId);
student.setName(studentName);

return 0;
}

您所指的错误原因是模板函数reduce():

template< class InputIt >
typename std::iterator_traits<InputIt>::value_type
reduce( InputIt first, InputIt last );

没有定义

你的意思是:

template< class InputIt >
typename std::iterator_traits<InputIt>::value_type
reduce( InputIt first, InputIt last )
{
return std::reduce( first, last );
}

在成员函数calculateAverage()中,需要使用限定名来避免歧义:

void calculateAverage() {
average = (::reduce(gradesVec.begin(),gradesVec.end())) / ( float )(gradesVec.size());
}

下面是一个演示程序:

#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
template< class InputIt >
typename std::iterator_traits<InputIt>::value_type
reduce( InputIt first, InputIt last )
{
return std::reduce( first, last );
}
class Student
{
public:
std::vector<int> gradesVec;
float average;
void calculateAverage() {
average = (::reduce(gradesVec.begin(),gradesVec.end())) / ( float )(gradesVec.size());
}
};    
int main()
{
Student student = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } };
student.calculateAverage();
std::cout << "student.average = " << student.average << 'n';
}

程序输出为

student.average = 5.5

我认为模板函数::reduce()是多余的。您可以直接从成员函数中调用标准算法std::reduce()

最新更新