成员声明中不允许使用 C++ 限定名称
Posted
技术标签:
【中文标题】成员声明中不允许使用 C++ 限定名称【英文标题】:C++ Qualified name is not allowed in member declaration 【发布时间】:2018-06-23 15:47:40 【问题描述】:我正在关注 2012 年的 Fleeps 旧教程之一。我遇到了一个减速带,这个错误:在成员声明中不允许限定名称。 我尝试更改 SDK,在 main.cpp 文件中定义/声明类。这些都不起作用。 这是我遇到错误的头文件。
#pragma once
#include <Windows.h>
#include "d3d9.h"
#include <ctime>
#include <iostream>
#define D3DHOOK_TEXTURES
#define MAX_MENU_ITEMS 6
#define WALLHACK 0
#define CUSTOM_CROSSHAIR 1
#define NO_RECOIL 2
#define UNLIM_AMMO 3
#define AUTO_FIRE 4
#define HIDE_MENU 5
class Hacks
public:
int m_Stride;
void Hacks::CreateFont(IDirect3DDevice9 *d3dDevice, std::string choiceFont);
void Hacks::InitializeMenuItems();
void Hacks::DrawText(LPCSTR TextToDraw, int x, int y, D3DCOLOR Color);
void Hacks::DrawMenu(IDirect3DDevice9 *d3dDevice);
void Hacks::DrawFilledRectangle(int x, int y, int w, int h, D3DCOLOR Color, IDirect3DDevice9 *d3dDevice);
void Hacks::DrawBorderBox(int x, int y, int w, int h, int thickness, D3DCOLOR Color, IDirect3DDevice9 *d3dDevice);
void Hacks::KeyboardInput();
LPDIRECT3DTEXTURE9 texRed;
LPDIRECT3DTEXTURE9 texGreen;
LPDIRECT3DTEXTURE9 texBlue;
LPDIRECT3DTEXTURE9 texWhite;
D3DVIEWPORT9 ViewPort;
LPD3DXFONT Font;
struct d3dMenuHack
bool on;
std::string name;
;
d3dMenuHack hack[MAX_MENU_ITEMS];
;
当我声明“void Hacks::”...函数时出现错误。有什么建议吗?
【问题讨论】:
删除这些Hacks::
s。
我尝试更改 SDK,在 main.cpp 文件中定义/声明类。这些都不起作用——这表明遵循不教授 C++ 编程的教程是浪费时间。没有任何著名的 C++ 书籍会显示以这种方式编码的类出现此错误。
@songyuanyao 谢谢。这解决了这个问题,我现在可以编译项目了。虽然当我构建它时,它给了我这个错误“Error LNK2001: unresolved external symbol __vsnprintf”
您收到链接错误,因为旧版 DirectX SDK 与 VS 2015 或 VS 2017 不完全兼容。请参阅Where’s DXERR.LIB?。
目前没有理由花时间学习 Direct3 9。查看 DirectX 11。请参阅 this post。一本关于 Direct3D 9 的旧书/教程也很可能使用更古老的 C++ 编码风格,而不是现代 C++11/C++14 语言。
【参考方案1】:
也许 nikau6 的答案乍一看并不那么清楚,因为代码似乎与 OP 中的相同。
因此,解决方案是从您的所有声明中删除 Hacks::
【讨论】:
【参考方案2】:没有可在成员声明中使用的限定名称。您的书中使用了哪种编译器?
class Hacks
public:
int m_Stride;
void CreateFont(IDirect3DDevice9 *d3dDevice, std::string choiceFont);
void InitializeMenuItems();
void DrawText(LPCSTR TextToDraw, int x, int y, D3DCOLOR Color);
void DrawMenu(IDirect3DDevice9 *d3dDevice);
void DrawFilledRectangle(int x, int y, int w, int h, D3DCOLOR Color, IDirect3DDevice9 *d3dDevice);
void DrawBorderBox(int x, int y, int w, int h, int thickness, D3DCOLOR Color, IDirect3DDevice9 *d3dDevice);
void KeyboardInput();
LPDIRECT3DTEXTURE9 texRed;
LPDIRECT3DTEXTURE9 texGreen;
LPDIRECT3DTEXTURE9 texBlue;
LPDIRECT3DTEXTURE9 texWhite;
D3DVIEWPORT9 ViewPort;
LPD3DXFONT Font;
struct d3dMenuHack
bool on;
std::string name;
;
d3dMenuHack hack[MAX_MENU_ITEMS];
;
【讨论】:
【参考方案3】:在 Visual Studio 2019 中构建旧版 Direct Show 过滤器时,我必须将 Conformance Mode
设置为 No。这允许代码不符合标准 /permissive-
以上是几个人所说的不良做法。但是对于遗留代码,通常不适合(或不可能)使其遵循最佳实践。
【讨论】:
感谢您的提示!在使用 Visual Studio 2017 从 Windows SDK 8.1 编译头文件时,我还遇到了奇怪的遗留代码 - 在<combaseapi.h>
、<gdiplusheaders.h>
、<gdiplusstringformat.h>
等中有这样的地方。以上是关于成员声明中不允许使用 C++ 限定名称的主要内容,如果未能解决你的问题,请参考以下文章
使用与 C++ 标准允许的成员变量相同的名称为构造函数参数初始化成员变量? [复制]
与父项同名的 C++ 成员变量没有完全限定(只要它是可扩展的?)