【问题标题】:C++ Qualified name is not allowed in member declaration成员声明中不允许使用 C++ 限定名称
【发布时间】: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 语言。

标签: c++ error-handling directx direct3d


【解决方案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; 等中有这样的地方。
      猜你喜欢
      • 2011-10-30
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多