Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++_Multiple Definition Error - Fatal编程技术网

C++ 静态常量类成员的多个定义错误

C++ 静态常量类成员的多个定义错误,c++,multiple-definition-error,C++,Multiple Definition Error,我最近遇到了中所述的问题,我正试图通过为所有静态常量类成员(而不仅仅是导致链接器错误的成员)的相应.cpp文件添加定义,使代码符合要求 在多个编译单元中使用常量的情况下,我会得到多个定义错误,即使该定义仅在一个compliation单元中 将初始值设定项移动到定义中可以防止错误,但我不希望这样做 值得一提的是,当我目前在Visual Studio中工作时,这段代码需要构建在多个平台上。我认为如果您希望代码在多个平台上工作,应该将初始化移到定义中(在.cpp文件中)。尽管它可能在一个或多个编译器上

我最近遇到了中所述的问题,我正试图通过为所有静态常量类成员(而不仅仅是导致链接器错误的成员)的相应.cpp文件添加定义,使代码符合要求

在多个编译单元中使用常量的情况下,我会得到多个定义错误,即使该定义仅在一个compliation单元中

将初始值设定项移动到定义中可以防止错误,但我不希望这样做


值得一提的是,当我目前在Visual Studio中工作时,这段代码需要构建在多个平台上。

我认为如果您希望代码在多个平台上工作,应该将初始化移到定义中(在.cpp文件中)。尽管它可能在一个或多个编译器上工作,但不要依赖它来实现可移植性。

我认为如果您希望代码在多个平台上工作,应该将初始化移到定义中(在.cpp文件中)。尽管它可能在一个或多个编译器上运行,但不要依赖于它的可移植性。

静态成员变量在类主体中声明,在类主体之外定义一次。一般的做法是:

class MyClass

{
    static int i;

};

int MyClass::i = 0;

<>定义是在C++源文件中完成的,而不是在头(h)中完成的。如果这样做,变量将在包含的头文件的任何地方定义。您似乎面临着同样的问题。

静态成员变量在类主体中声明,在类主体之外定义一次。一般的做法是:

class MyClass

{
    static int i;

};

int MyClass::i = 0;

<>定义是在C++源文件中完成的,而不是在头(h)中完成的。如果这样做,变量将在包含的头文件的任何地方定义。看起来您正面临着同样的问题。

根据其中一篇文章,这实际上可能是一个visual studio bug,阻止您使用这种形式的初始化

不幸的是,我认为您可能被困在源文件中进行初始化以保持可移植性


我创建了一个简单的示例,在g++4.2中编译并链接了fine。

根据其中一篇文章,这实际上可能是一个visual studio bug,阻止您使用这种形式的初始化

不幸的是,我认为您可能被困在源文件中进行初始化以保持可移植性


我创建了一个在g++4.2中编译并链接良好的简单示例。

如果启用了语言扩展,Visual Studio将允许您使用静态常量对象,而无需在实现文件中定义。不幸的是,它将在正确的C++程序中发布错误(如果我记得正确的话)。
尝试禁用语言扩展。

如果启用了语言扩展,Visual Studio将允许您使用静态常量对象,而无需在实现文件中定义。不幸的是,它将在正确的C++程序中发布错误(如果我记得正确的话)。
尝试禁用语言扩展。

您能给我们看一下您的代码吗?要补充@Birrree所说的内容,请将您的代码简化为最小的完整示例,以说明您的问题。在减少代码时,您可以发现问题(您不需要我们),也可以让我们更容易发现问题(您会更快得到答案)。有关简短、自包含的完整示例程序的更多信息,咨询。@Birrree和@Rob-代码与链接问题和答案中的代码没有显著差异。如果代码与链接问题没有显著差异,那么您就不会从其中的建议中遇到此问题。既然您提出了这个问题,您可能应该向我们展示您的代码,这样我们就可以指出问题所在。@Birrye这个问题与Visual Studio语言扩展有关(请参阅Lindydancer的answser)这就是为什么在链接的问题中它不是一个问题。你能给我们看一下你的代码吗?为了补充@Birrree所说的内容,请将你的代码简化为最小的完整示例,以说明你的问题。在减少代码时,您可以发现问题(您不需要我们),也可以让我们更容易发现问题(您会更快得到答案)。有关简短、自包含的完整示例程序的更多信息,咨询。@Birrree和@Rob-代码与链接问题和答案中的代码没有显著差异。如果代码与链接问题没有显著差异,那么您就不会从其中的建议中遇到此问题。既然您提出了问题,您可能应该向我们展示您的代码,以便我们指出问题所在。@Birrye问题与Visual Studio语言扩展有关(请参阅Lindydancer的answser),这就是为什么在链接问题中它不是问题的原因。我试图在问题中通过包括“对应的.cpp”和“定义仅在其中一个合规单位中”我试图通过包括“对应的.cpp”和“定义仅在其中一个合规单位中”来澄清这不是问题“您知道它是否已在Visual Studio的更高版本中得到更正吗?我仍在使用2005。您知道它是否已在Visual Studio的更高版本中更正?我仍在使用2005。禁用语言扩展不是一个选项,因为没有它们Windows7 SDK无法编译。但是,中介绍的selectany选项似乎可以做到这一点。禁用语言扩展不是一个选项,因为Windows7 SDK在没有它们的情况下无法编译。但是,中介绍的selectany选项似乎可以实现这一目的。