对c++编译错误感到困惑

confused about C++ compiler error

本文关键字:错误 c++ 编译      更新时间:2023-10-16

我完全糊涂了。我在另一个论坛(cplusplus)早些时候发布了这个代码,并得到了帮助,但我不明白为什么编译器给了我这个错误,当我问那里没有回应,所以我希望有人能在这里更详细地解释它。

错误:

Person .cpp:在构造函数' Person::Person(QString) '中:person.cpp:12:16:错误:没有匹配的函数调用' Position::Position() ': m_Name(名字)

从错误中指向的行下面的代码中可以看到- person.cpp:12:16 -不是" ' Position::Position() ': m_Name(名字)。

这是建议的解决方案(#2有效):

你没有指定应该使用什么构造函数来构造m_Position,所以编译器假设你想使用默认构造函数(不带参数的构造函数)。问题是Position没有默认构造函数,所以你会得到这个错误。

有两种方法可以解决这个问题。

  1. 为Position添加一个默认值
  2. 在Person构造函数中指定你想要使用一个现有的构造函数来构造m_Position。

人:人(QString名称): m_Name(名称),m_Position("123"、"abc"){

}

这就是我仍然困惑的地方为什么编译器会在那个文件中指向那行错误;我想,为什么需要构造函数呢?我假设它到达了那个点,然后停止并读取文件,直到它在setPosition()中看到对Position和Employer的引用,然后停止并打印错误。

但如果是这种情况,那么我仍然不明白为什么它需要这个特定的构造函数,而不是我尝试的其他两个构造函数(默认没有参数,cstor有一个参数)。当你(其他论坛)指出

"specify what constructor should be used to construct m_Position"

我想我在某个地方读到编译器会在飞行中创建一个默认的复制构造函数,这就是我期望在setPosition() (Position和Employer被引用的地方)中发生的事情,因为现在,我只是试图让这个机制发挥作用,然后我将在稍后充实小细节。

所以这就是我的问题:为什么编译器这样做?

这是原始代码(或多或少)。

person.cpp ===========================================

// Person.cpp
// pn Mar03-2014
#include <QString>
#include <QTextStream>
//#include "position.h"
#include "person.h"
//#include "employer.h"
Person::Person(QString name)
  : m_Name(name)
{
}
QString Person::toString()
{
  QString buffer;
  QTextStream bufStr(&buffer);
  bufStr << "Person Name: " << m_Name << endl;
  //buffer = "Person Name: " + m_Name + "n";
  return buffer;
}
void Person::setPosition(Employer newC, Position newP)
{
  m_Position = newP;
  m_Employer = newC;
}

person.h =============================================

#ifndef _PERSON_H_ 
#define _PERSON_H_  
#include <QString>
#include "employer.h"
#include "position.h"
//class Employer;
//class Position;
class Person
{
  public:
    Person(QString name);
    void setPosition(Employer newC, Position newP);
    QString toString();
  private:
    QString m_Name;
    bool m_Employed;
    Position m_Position;
    Employer m_Employer;
};
#endif

position.h ===========================================

#ifndef _POSITION_H_ 
#define _POSITION_H_  
#include <QString>
//class Employer;
//class Person;
class Position
{
  public:
    Position(QString name, QString description);
    QString toString();
  private:
    QString m_Name;
    QString m_Description;
};
#endif

position.cpp =========================================

// Position.cpp
// pn Mar03-2014
#include <QString>
#include <QTextStream>
#include "position.h"
//#include "person.h"
//#include "employer.h"
Position::Position(QString name, QString description)
  : m_Name(name), m_Description(description)
{
}
QString Position::toString()
{
  QString buffer;
  QTextStream bufStr(&buffer);
  bufStr << "Position Name: " << m_Name << endl;
  bufStr << "Position Description: " << m_Description << endl;
  //buffer = "Position Name: " + m_Name + "n";
  //return buffer.toStdString();
  return buffer;
}

employer.h ===========================================

// employer.h
// pn mar08-2014
#ifndef _EMPLOYER_H_ 
#define _EMPLOYER_H_  
#include <QString>
//using namespace std;
//class Person;
//class Position;

class Employer
{
  public:
    Employer(QString name, QString market);
    // bool hire(Person& newHire, Position pos);
    QString toString();
  private:
    QString m_Name;
    QString m_Market;
};
#endif

employer.cpp ==========================================

// employer.cpp
// pn Mar05-2014
#include <QString>
#include <QTextStream>
#include "position.h"
#include "person.h"
#include "employer.h"
Employer::Employer(QString name, QString market)
  : m_Name(name), m_Market(market) {}
QString Employer::toString()
{
  QString buffer;
  QTextStream bufStr(&buffer);
  bufStr << "Employer Name: " << m_Name << endl;
  bufStr << "Employer Market: " << m_Market << endl;
  //buffer = "Person Name: " + m_Name + "n";
  //return buffer.toStdString();
  return buffer;  //QString
}
/*
bool Employer::hire(Person& newHire, Position pos)
{
  return true; 
}
*/

work.cpp(主要 ) ======================================

// work.cpp
// pn mar05-2014
#include <QString>
#include <QTextStream>
#include <iostream>
#include "person.h"
#include "employer.h"
#include "position.h"
using namespace std;
int main()
{
  QString name;
  QString company;
  QString location;
  Person phil("Bozo");
  Employer sst("SST", "Speed");
  Position posture("Standing", "Not Sitting");
  //QTextStream qts();
  //qts << phil.toString();
  name = phil.toString();
  cout << name.toStdString();
  company = sst.toString();
  cout << company.toStdString();
  location = posture.toString();
  cout << location.toStdString();
  return 0;
}

其他错误 =======================================

person.cpp:12:16: note: candidates are:
In file included from person.h:6:0,
                 from person.cpp:7:
position.h:14:5: note: Position::Position(QString, QString)
     Position(QString name, QString description);
     ^
position.h:14:5: note:   candidate expects 2 arguments, 0 provided
position.h:9:7: note: Position::Position(const Position&)
 class Position
       ^
position.h:9:7: note:   candidate expects 1 argument, 0 provided
person.cpp:12:16: error: no matching function for call to ‘Employer::Employer()’
   : m_Name(name)
                ^
person.cpp:12:16: note: candidates are:
In file included from person.h:5:0,
                 from person.cpp:7:
employer.h:19:5: note: Employer::Employer(QString, QString)
     Employer(QString name, QString market);
     ^
employer.h:19:5: note:   candidate expects 2 arguments, 0 provided
employer.h:14:7: note: Employer::Employer(const Employer&)
 class Employer
       ^
employer.h:14:7: note:   candidate expects 1 argument, 0 provided
make: *** [person.o] Error 1

======================================================

你的类Person包含了类型为Position的数据成员m_Position

class Person
{
  public:
  //...
  private:
    Position m_Position;
    //...
};

类位置没有默认构造函数,因为有显式声明的带参数的构造函数

class Position
{
  public:
    Position(QString name, QString description);
    //...
};

当你创建Person类型的对象时,它的构造函数

Person::Person(QString name)
  : m_Name(name)
{
}

。因为你没有初始化它的数据成员m_Position在mme -initializer列表(你只初始化数据成员m_Name),然后构造函数试图初始化它自己调用类Position的默认构造函数。然而,正如我上面指出的,Position类没有默认构造函数,编译器会发出错误。

可以这样定义Person类的构造函数

Person::Person(QString name)
  : m_Name(name), m_Position( "", "" )
{
}

或者你可以传递其他东西来初始化m_Person。

简短的回答:您有一个循环依赖。你试图将字符串转换为QString。

长答案:雇主。cpp #包括个人,而个人。h #也包括雇主。不应该存在循环依赖。

这里有一张图来说明:https://i.stack.imgur.com/AdZ8i.jpg

同样,您正在尝试将字符串(或c-string)转换为QString。尝试创建一个辅助函数来简化转换(如果还没有创建的话)。

最后,需要初始化所有成员变量。

Person::Person(QString name)
: m_Name(name),
m_Employed(false),
m_Position(Position(QString(), QString())),
m_Employer(Employer(QString(), QString()))
{
}