错误 C2511 - 未找到重载的成员函数

Posted

技术标签:

【中文标题】错误 C2511 - 未找到重载的成员函数【英文标题】:Error C2511 - overloaded member function not found 【发布时间】:2016-11-08 18:14:29 【问题描述】:

在下面的代码示例中,Die 类只是 AttackDie 继承的一个基类。实例化 AttackDie 时,它​​需要存储在 StatSys 类的实例中的数据和一个整数值。因此,AttackDie 的构造函数被设计为将 StatSys 的实例和一个整数作为输入。但是,编译器在包含 AttackDie::AttackDie(StatSys * LocalSystem, int Type) 的行上抛出 C2511 错误 错误如下:

AttackDie::AttackDie(StatSys *,int)': 在 'AttackDie 中找不到重载的成员函数

我不明白为什么会出现这个错误。我已经检查了标题和来源。声明和实现接口似乎都匹配。有人可以指导我解决这个问题吗?

代码示例

骰子.cpp

#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <Dice.h>
#include <StatisticsSystem.h>

using namespace std;

AttackDie::AttackDie(StatSys * LocalSystem, int Type)

    DataIntegrity = true;

    if (Type > -1)
    
        switch (Type)
        
        case 0:
            DieType = "Red";
            DieClass = "Damage";
            break;

        case 1:
            DieType = "Green";
            DieClass = "Balanced";
            break;

        case 2:
            DieType = "Blue";
            DieClass = "Accuracy";
            break;

        case 3:
            DieType = "Yellow";
            DieClass = "Surge";
            break;

        default:
            cout << "Unrecognized TypeNum value (>). Initialization of key AttackDie variables failed./n";
            DieType = "Error";
            DieClass = "Error";
            DataIntegrity = false;
        
    
    else
    
        cout << "Unrecognized TypeNum value (<). Initialization of key AttackDie variables failed./n";
        DieType = "Error";
        DieClass = "Error";
        DataIntegrity = false;
    

    if (DataIntegrity)
    
        const int GROUP_SIZE = 3;
        int Iterator = 0;

        int Test[3];
        bool CSVDataValid = true;
        for (int OuterCounter = 0; OuterCounter <= LocalSystem->NUM_OF_SIDES - 1; OuterCounter++)
        
            Test[0] = LocalSystem->AccessCSVData(Type, Iterator);
            Test[1] = LocalSystem->AccessCSVData(Type, Iterator + 1);
            Test[2] = LocalSystem->AccessCSVData(Type, Iterator + 2);
            Iterator += GROUP_SIZE;
            if (Test[0] <= -1 || Test[1] <= -1 || Test[2] <= -1)
            
                CSVDataValid = false;
            
            else
            
                Sides[OuterCounter].Damage = Test[0];
                Sides[OuterCounter].Surges = Test[1];
                Sides[OuterCounter].Accuracy = Test[2];
            
        
        if (!CSVDataValid)
        
            cout << "Side specific parameters were not set. CSV data not valid.";
            DataIntegrity = false;
        
        else
        
            Total =  0, 0, 0 ;
            for (int SideCounter = 0; SideCounter <= 5; SideCounter++)
            
                Total.Damage += Sides[SideCounter].Damage;
                Total.Surges += Sides[SideCounter].Surges;
                Total.Accuracy += Sides[SideCounter].Accuracy;
            
            Averages.Damage = Total.Damage / LocalSystem->NUM_OF_SIDES;
            Averages.Surges = Total.Surges / LocalSystem->NUM_OF_SIDES;
            Averages.Accuracy = Total.Accuracy / LocalSystem->NUM_OF_SIDES;
        
    

骰子.h

#pragma once
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <cmath>


using namespace std;

struct AttackStatAverages

    double Damage;
    double Surges;
    double Accuracy;
;

struct DefenseStatAverages

    double Blocks;
    double Evades;
    int Dodges;
;

class Die

public:
    string GetDieType();
    string GetDieClass();


protected:
    string DieType;
    string DieClass;
    bool DataIntegrity;
;


class AttackDie : public Die

public:
    AttackDie(StatSys * LocalSystem, int Type);
    int GetSides(int SideNum, int Parameter);
    double GetAverages(int Parameter);
    int GetTotal(int Parameter);
    ~AttackDie();

private:
    AttackStats Sides[6];
    AttackStatAverages Averages;
    AttackStats Total;
;

StatisticsSystem.h

    #pragma once
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <iostream>
    #include <cmath>
    #include <Dice.h>
    #include <vector>

    using namespace std;

    struct DicePackage
    
        int Mode;
        int Quantity;
        int NumberOfPossibilities;
        bool Error;
        AttackDie* AttackDice[4];
        DefenseDie* DefenseDice[3];
    ;

    class StatSys
    
        friend class AttackDie;
        friend class DefenseDie;
    public:
        StatSys();
        ~StatSys();
        const double VERSION = 0.1;
        int AccessCSVData(int Row, int Column);

    private:
        static const int MAX_NUM_OF_DICE = 4;
        const int METHOD_ERROR_SIZE = 10;
        const int NUM_OF_SIDES = 6;
        const int GROUP_SIZE = 3;
        const int DAMAGE = 0;
        const int SURGES = 1;
        const int ACCURACY = 2;
        const int BLOCKS = 0;
        const int EVADES = 1;
        const int DODGE = 2;
        const int ITERATIONS = 3;
        DicePackage DiceSet;
        bool CSVDataState;
        bool ErrorDataState;
        int CSVData[6][18];
        vector<string> Errors;
        vector<string> ErrorDescriptions;
        int StringToInt(string Value);
        void LoadCSV();

【问题讨论】:

请发布一个minimal reproducible example 以重现您的问题以及逐字错误消息(强调minimal)。 支持 MCVE 的请求。代码太多且不完整。我在整理此问题时采取的任何措施都会更改代码,并可能会解决您的问题。 离题:Dice.h 中的错误。它不是#include &lt;StatisticsSystem.h&gt;。这会强制对任何人(包括 Dice.h)进行未记录的额外依赖或包含排序。 原来这不是那么离题。我认为您正在构建陈旧的对象或根本不构建 Dice.cpp。执行 Build->Clean Solution,然后再次构建并确保 Dice.cpp 没有被遗漏。 我只是将代码简化为解释中引用的位,添加了 StatisticSystem.h 的 sn-ps 以更全面地了解问题,并更清楚地隔离逐字错误以试图最好提供一个 MCVE。 @ user4581301,我一定错过了包含声明。我会补充的。感谢您指出这一点。 【参考方案1】:
#include <Dice.h>
#include <StatisticsSystem.h>

应该是

#include "Dice.h"
#include "StatisticsSystem.h"

主要用于系统头文件

"" 用于同一目录下的头文件

【讨论】:

不是一个好的答案,因为它没有解决 OP 的问题。不过,这将是一个很好的评论。 哦,是的,我忘记了那个细节。我会做出改变。感谢您的回复。 我将它编辑为还有 StatisticsSystem.h。在我没有意识到这是一个自定义文件之前。 AttackStats 声明在哪里?我看到它在 Dice.h 中被引用,但我不知道它是如何在该范围内声明的。 我的猜测是它是在 Dice.h 一无所知的 AttackDie 类中声明的。这就是为什么它需要包含 StatisticsSystem.h。这样朋友声明就会在那里。您可以尝试使 Total 成为一个指向 AttackStats 对象的指针,然后向前声明该类。不确定,因为我们没有看到全貌。我好像少了一些代码。【参考方案2】:

看起来 user4581301 是正确的。将#include &lt;StatisticsSystem.h&gt; 添加到 Dice.h 解决了这个问题,因为 Dice.h 实际上需要来自该标头的数据。

【讨论】:

以上是关于错误 C2511 - 未找到重载的成员函数的主要内容,如果未能解决你的问题,请参考以下文章

小于运算符不能作为成员函数重载

成员函数与内联函数

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

什么运算符一定要重载友元函数,什么时候一定要重载为成员函数?

PHP PDO:致命错误:未捕获的错误:在第[duplicate]行上对bool成员函数execute()的调用

从一个二级题来看成员函数重载运算符和友元函数重载运算符