错误 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 <StatisticsSystem.h>
。这会强制对任何人(包括 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 <StatisticsSystem.h>
添加到 Dice.h 解决了这个问题,因为 Dice.h 实际上需要来自该标头的数据。
【讨论】:
以上是关于错误 C2511 - 未找到重载的成员函数的主要内容,如果未能解决你的问题,请参考以下文章
C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?
什么运算符一定要重载友元函数,什么时候一定要重载为成员函数?