成员声明中不允许使用 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 编译头文件时,我还遇到了奇怪的遗留代码 - 在&lt;combaseapi.h&gt;&lt;gdiplusheaders.h&gt;&lt;gdiplusstringformat.h&gt; 等中有这样的地方。

以上是关于成员声明中不允许使用 C++ 限定名称的主要内容,如果未能解决你的问题,请参考以下文章

班级没有成员发言? [关闭]

使用与 C++ 标准允许的成员变量相同的名称为构造函数参数初始化成员变量? [复制]

与父项同名的 C++ 成员变量没有完全限定(只要它是可扩展的?)

在非限定 id 之后的静态数据成员定义中使用的名称

在模板派生类中,为啥我需要在成员函数中使用“this->”来限定基类成员名称?

转C++ const成员变量和成员函数(常成员函数)