【发布时间】:2020-07-10 08:39:27
【问题描述】:
根据错误代码,编译器 (MSVC 2019) 未检测到正确声明的类。
在以下代码中,编译器在UACcDefault 类定义中第一次提及UACvLogin 时停止。
[\src\UAC\controllers\UACcDefault.h][1]:
#ifndef MANAGER_UACCDEFAULT_H
#define MANAGER_UACCDEFAULT_H
#include "src/includes.h"
#include "../views/UACvLogin.h"
#include "../models/UACmUsers.h"
//class UACvLogin;
//class UACmUsers;
class UACcDefault {
public:
UACcDefault();
UACcDefault(int iMaxLogin, UACmUsers* mUsers = nullptr, UACvLogin* viewLogin = nullptr);
virtual ~UACcDefault();
int GetUserid() const;
void SetUserid(int userid);
const wxString& GetUsername() const;
void SetUsername(const wxString& username);
const wxString& GetPassword() const;
void SetPassword(const wxString& password);
int GetContactid() const;
void SetContactid(int contactid);
bool GetLoggedIn();
protected:
private:
UACmUsers* mUsers;
UACvLogin* viewLogin;
int iMaxLogin;
};
#endif //MANAGER_UACCDEFAULT_H
错误信息是:
src/UAC/controllers/UACcDefault.h(19): error C2061: syntax error: identifier 'UACvLogin'
src/UAC/controllers/UACcDefault.h(37): error C2143: syntax error: missing ';' before '*'
src/UAC/controllers/UACcDefault.h(37): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
src/UAC/controllers/UACcDefault.h(37): error C2238: unexpected token(s) preceding ';'
我研究了代码,C2061、C2143、C4430、C2238,它们表明编译器没有检测到 UACvLogin 之前已经声明过。
每当我采取措施缓解这些错误时,例如更改代码以使 UACvLogin 不是指针时,我都会收到以下错误消息:
src/UAC/controllers/UACcDefault.h(37): error C3646: 'viewLogin': unknown override specifier
src/UAC/controllers/UACcDefault.h(37): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
编译器现在关注变量的名称 (viewLogin),而不是类型。如果我从头文件中删除 UACvLogin* viewLogin(该变量当前仅用于一种方法),或者取消注释 class UACvLogin; 行,编译器会将其焦点更改为 UACmUsers 标识符:
src/UAC/controllers/UACcDefault.h(36): error C2143: syntax error: missing ';' before '*'
src/UAC/controllers/UACcDefault.h(36): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
src/UAC/controllers/UACcDefault.h(36): error C2238: unexpected token(s) preceding ';'
如果我取消注释 both 类声明 class UACvLogin; 和 class UACmUsers;,编译器会抱怨 SOCI 库。我不会在这里引用错误消息。
我使用/P 选项执行了构建以查看预处理器输出,并且包含将类声明放在它们应该在的位置:在UACcDefault 类中使用/引用它们之前。
谁能帮我找出这个错误的原因?
整个项目在GitHub。
src\includes.h-
../views/UACvLogin.h=src\UAC\views\UACvLogin.h -
../models/UACmUsers.h=src\UAC\models\UACmUsers.h -
cmake-build-debug-msvc-2019/UACvLogin.i10.2MB 此文件显示了UACvLogin.cpp的预处理器输出。 -
cmake-build-debug-msvc-2019/UACmUsers.i10.2MB 此文件显示了UACmUsers.cpp的预处理器输出。 -
cmake-build-debug-msvc-2019/UACcDefault.i10.2MB 此文件显示了UACcDefault.cpp的预处理器输出。
【问题讨论】:
-
UACvLogin.h是否包含UACcDefault.h? -
请尝试创建一个minimal reproducible example(强调minimal部分)。
-
如果没有看到
"../views/UACvLogin.h",就很难诊断问题。您说UACvLogin已正确声明,但显然有问题。不得不同意 Nathan 这看起来有点像循环依赖。 -
我查看了 github 存储库,发现与
"UACvLogin.h"存在循环依赖关系,最终试图包含自身,这就是问题所在。 -
如果您查看预处理器输出文件 (raw.githubusercontent.com/ptrongithub/Manager/development/…),
UACvLogin.h仅包含一次。每个头文件都有包含保护。
标签: c++ boost wxwidgets clion soci