У меня есть совершенно нормальный код (файл cpp и cpp) и make-файл, но когда я пытаюсь скомпилировать его с помощью 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 работали нормально, но когда я добавил эту часть в код, что бы я ни делал, я получаю эту ошибку
ОТ: Пожалуйста, прочитайте В чем проблема с «использованием пространства имен std;»? И учтите, что делать это в заголовочном файле еще хуже.
Также обратите внимание: вы используете MacOS (вы должны четко указать это в своем вопросе), что означает, что даже если вы вызвали g++, на самом деле вы запустили clang, поэтому вам следует изменить теги на clang или clang++. Эта проблема не связана с GCC/G++. Это также не связано с маркой, поэтому тег makefile не актуален.
Примечание по использованию: заголовок должен представлять собой краткое изложение технической проблемы, с которой вы столкнулись. Это должно дать будущему спрашивающему, который найдет вопрос в списке результатов поиска и сможет видеть только заголовок, некоторую подсказку о том, стоит ли тратить время на его чтение или нет, чтобы получить помощь. Нынешнее название настолько широкое, что оно практически бесполезно. Это может относиться почти к проблеме C++.





Ваш конструктор 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 совпадали.
subjects.emplace_back(s_id, s_name, s_credit, s_prerequisite, majors);:majorsимеет типstd::vector<std::string>, но последний параметр конструктораSubjectимеет типstd::string.