Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;错误:不是成员或多个定义_C++_Static_Constants - Fatal编程技术网

C++ C++;错误:不是成员或多个定义

C++ C++;错误:不是成员或多个定义,c++,static,constants,C++,Static,Constants,我试图使用我在类中定义的静态常量字段。 当我这样定义它时: class DisjunctionQuery : public Query { public: DisjunctionQuery (); static const std::string prefix; }; const std::string DisjunctionQuery::prefix = "Or"; 上面写着:“析取查询::前缀”的多重定义 如果我这样更改(删除两行): 它说当我试图在另一个地方调用

我试图使用我在类中定义的静态常量字段。
当我这样定义它时:

class DisjunctionQuery : public Query
{

  public:
    DisjunctionQuery ();
    static const std::string prefix;


};
const std::string DisjunctionQuery::prefix = "Or";
上面写着:“析取查询::前缀”的多重定义 如果我这样更改(删除两行):

它说当我试图在另一个地方调用它时,“prefix”不是“DisjunctionQuery”的成员

我怎样才能让它工作?
谢谢。

您可以将定义移动到单个实现文件中

如果将其保留在标题中,将打破一个定义规则。包含标头的每个文件都将尝试定义
静态
成员,这是错误的

//DisjunctionQuery.h
class DisjunctionQuery : public Query
{
  public:
    //....
    static const std::string prefix;
};

//DisjunctionQuery.cpp
#include "DisjunctionQuery.h"
const std::string DisjunctionQuery::prefix = "Or";

s/将尝试定义/将尝试实现/。该定义在类定义内;多个实现方案是问题所在。@cdhowie不,这只是一个声明。此外,没有数据成员的实现,只有函数的实现。您假设tomer没有添加包含保护。@user1417475包含保护不重要。我说的是包含在多个翻译单元中,所以包含守卫是不相关的。
//DisjunctionQuery.h
class DisjunctionQuery : public Query
{
  public:
    //....
    static const std::string prefix;
};

//DisjunctionQuery.cpp
#include "DisjunctionQuery.h"
const std::string DisjunctionQuery::prefix = "Or";