C++类中静态字符串的奇怪编译器错误

C++ Strange Compiler Errors with Static Strings in a Class

本文关键字:编译器 错误 字符串 静态 C++      更新时间:2023-10-16

我有一个程序,它在构建失败后在编译器控制台中输出以下内容:

1>------ Build started: Project: BlackjackAttack, Configuration: Debug Win32 ------
1>Build started 9/18/2012 10:59:28 PM.
1>InitializeBuildStatus:
1>  Touching "DebugBlackjackAttack.unsuccessfulbuild".
1>ClCompile:
1>  main.cpp
1>c:bjablackjackattackconfig.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:bjablackjackattackconfig.h(5): error C2146: syntax error : missing ';' before identifier 'GAME_NAME'
1>c:bjablackjackattackconfig.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  Display.cpp
1>c:bjablackjackattackconfig.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:bjablackjackattackconfig.h(5): error C2146: syntax error : missing ';' before identifier 'GAME_NAME'
1>c:bjablackjackattackconfig.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  Config.cpp
1>c:bjablackjackattackconfig.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:bjablackjackattackconfig.h(5): error C2146: syntax error : missing ';' before identifier 'GAME_NAME'
1>c:bjablackjackattackconfig.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:bjablackjackattackconfig.cpp(7): error C2039: 'GAME_NAME' : is not a member of 'Config'
1>          c:bjablackjackattackconfig.h(1) : see declaration of 'Config'
1>  Generating Code...
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.32
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

配置.h:

class Config {
public:
  static const int DEFAULT_CONSOLE_COLOR = 7;
  static const string GAME_NAME;
};

配置.cpp:

#include <string>
#include "Config.h"
using std::string;
const string Config::GAME_NAME = "Name";

主.cpp:

#include <iostream>
#include "Config.h"
#include "Display.h"
int main(int argc, char *argv[]) {
  return 0;
}

有人可以解释为什么我的程序输出上述错误吗?

谢谢你的时间。

这是由于在整个项目中包含 Config.h 文件的方式造成的。

由于您的 Config 类引用 std::string,

因此在声明类之前必须包含 std::string。

在您的 Config.cpp 文件中,您

已经解决了冲突,但是您没有在 main.cpp 文件中执行相同的操作。

您有两种选择来解决问题。

  1. 每次包含"Config.h"时,您都包含string.h,并在其上方的行上写下"using std::string"。

  2. 您可以在 Config.h 文件的顶部包含 string.h 以及 "using std::string;" 指令。

以上所有内容都是不正确的,尽管这里看到的 #include 模式并不"好"。

问题是在使用 std::string 之前不包括在内。最好包含在 config.cpp 中,然后"使用命名空间 std"。

真正的问题是你在config.h中使用string而不是std::string。移动东西只会掩盖问题。

您可以将using std::string放在 config.h 中,但这是不受欢迎的 - 它会在任何包含它的源中引入不必要的符号。