当我尝试使用 g++ 进行编译并且使用 macOS 时,我收到有关构造函数的错误:没有匹配的构造函数用于初始化[关闭]

问题描述 投票:0回答:1

我有一个完全正常的代码(一个 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 工作得很好,但是当我将这部分添加到代码中时,无论我做什么,我都会收到此错误

c++ gcc compiler-errors g++
1个回答
1
投票

您的

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
的调用匹配。

© www.soinside.com 2019 - 2024. All rights reserved.