我有一个完全正常的代码(一个 cpp 和一个 cpp 文件)和一个 makefile,但是当我尝试用 g++ 编译它时,我得到了这个:
g++ -std=c++11 -c subject.cpp -o subject.o
In file included from subject.cpp:1:
In file included from ./subject.hpp:1:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/iostream:41:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/ios:221:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__locale:18:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/memory:848:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/allocator.h:165:28: error: no matching constructor for initialization of 'Subject'
::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/allocator_traits.h:290:13: note: in instantiation of function template specialization 'std::allocator<Subject>::construct<Subject, std::string &, std::string &, std::string &, std::string &, std::vector<std::string> &>' requested here
__a.construct(__p, _VSTD::forward<_Args>(__args)...);
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:808:21: note: in instantiation of function template specialization 'std::allocator_traits<std::allocator<Subject>>::construct<Subject, std::string &, std::string &, std::string &, std::string &, std::vector<std::string> &, void>' requested here
__alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__tx.__pos_),
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:1597:9: note: in instantiation of function template specialization 'std::vector<Subject>::__construct_one_at_end<std::string &, std::string &, std::string &, std::string &, std::vector<std::string> &>' requested here
__construct_one_at_end(_VSTD::forward<_Args>(__args)...);
^
subject.cpp:50:22: note: in instantiation of function template specialization 'std::vector<Subject>::emplace_back<std::string &, std::string &, std::string &, std::string &, std::vector<std::string> &>' requested here
subjects.emplace_back(s_id, s_name,s_credit,s_prerequisite,majors);
^
subject.cpp:3:10: note: candidate constructor not viable: no known conversion from 'std::vector<std::string>' to 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char>>') for 5th argument
Subject::Subject(string subject_id_,string subject_name_,string credit_,string prerequisite_,string qualified_majors_id_)
^
./subject.hpp:9:7: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 5 were provided
class Subject{
^
./subject.hpp:9:7: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 5 were provided
1 error generated.
make: *** [subject.o] Error 1
我不明白问题出在哪里 这些是其他文件,以防出现问题:
cpp:
#include "subject.hpp"
Subject::Subject(string subject_id_,string subject_name_,string credit_,string prerequisite_,string qualified_majors_id_)
{
subject_id=subject_id_;
subject_name=subject_name_;
credit=credit_;
prerequisite=prerequisite_;
qualified_majors_id=qualified_majors_id_;
}
string Subject::get_subject_id(){return subject_id;}
string Subject::get_subject_name(){return subject_name;}
string Subject::get_credit(){return credit;}
string Subject::get_prerequisite(){return prerequisite;}
string Subject::get_qualified_majors_id(){return qualified_majors_id;}
vector<Subject> readSubjectFromCSV(string &filename)
{
vector<Subject> subjects;
ifstream file(filename);
if (!file.is_open())
{
cerr << "Error opening file: " << filename << endl;
return subjects;
}
string header;
getline(file, header);
string line;
while (getline(file, line)) {
istringstream iss(line);
string s_id, s_name, s_credit, s_prerequisite, s_qualified_majors_id;
if (getline(iss, s_id, ',') &&
getline(iss, s_name, ',') &&
getline(iss, s_credit, ',') &&
getline(iss, s_prerequisite, ',')) {
vector<string> majors;
while (getline(iss, s_qualified_majors_id, ';')) {
majors.push_back(s_qualified_majors_id);
}
{
subjects.emplace_back(s_id, s_name,s_credit,s_prerequisite,majors);
}
}
else
{
cerr << "Error parsing line: " << line << endl;
}
}
file.close();
return subjects;
}
就在我添加新的 cpp 和 cpp 文件之前,以前的文件和 main.cpp 工作得很好,但是当我将这部分添加到代码中时,无论我做什么,我都会收到此错误
您的
Subject
构造函数需要五个字符串
Subject(string subject_id_,string subject_name_,string credit_,string prerequisite_,string qualified_majors_id_);
但是当您使用
Subject
构造函数时,您会传递四个字符串和一个字符串向量
subjects.emplace_back(s_id, s_name,s_credit,s_prerequisite,majors);
变量
majors
是 vector<string>
。
您需要决定
Subject
构造函数的第五个参数应该是 string
还是 vector<string>
。然后更改代码,使构造函数和对 emplace_back
的调用匹配。