C++ 尝试将常量添加到迭代器时发生链接器错误 #包括 #包括 使用名称空间std; 结构foo{ 静态常数int X=3; 静态字符栏(常量字符串和str){ //return str[X];//这是有效的 return*(str.begin()+X);//此操作失败 } }; int main(){ 除了声明它之外,您还需要定义foo::X。在foo之外进行定义 #include <string> #include <iostream> using namespace std; struct foo { static const int X = 3; static char bar(const string &str) { // return str[X]; // this works return *(str.begin() + X); // this fails } }; int main() { cout << foo::bar("abcdefg") << endl; }
除了声明它之外,还需要定义C++ 尝试将常量添加到迭代器时发生链接器错误 #包括 #包括 使用名称空间std; 结构foo{ 静态常数int X=3; 静态字符栏(常量字符串和str){ //return str[X];//这是有效的 return*(str.begin()+X);//此操作失败 } }; int main(){ 除了声明它之外,您还需要定义foo::X。在foo之外进行定义 #include <string> #include <iostream> using namespace std; struct foo { static const int X = 3; static char bar(const string &str) { // return str[X]; // this works return *(str.begin() + X); // this fails } }; int main() { cout << foo::bar("abcdefg") << endl; },c++,C++,除了声明它之外,还需要定义foo::X。在foo之外执行 #include <string> #include <iostream> using namespace std; struct foo { static const int X = 3; static char bar(const string &str) { // return str[X]; // this works return *(str.be
foo::X
。在foo
之外执行
#include <string>
#include <iostream>
using namespace std;
struct foo {
static const int X = 3;
static char bar(const string &str) {
// return str[X]; // this works
return *(str.begin() + X); // this fails
}
};
int main() {
cout << foo::bar("abcdefg") << endl;
}
你的编译器是什么?代码对我有用。C++0x中允许内联定义吗?试着用
-std=C++0x
编译。Kerrek SB:实际上我是用-std=C++0x编译的,因为我在其余代码中使用了其他功能。你能试着把X
的类型改为std::string::iterator::distance\u type
?它可以吗应该不会有什么不同,但话说回来,你发布的代码对我来说很好。它对我来说适用于gcc-O2
,而对gcc-O0
,所以这取决于编译器是否优化了对X的引用。你的编译器是什么?代码对我来说很好。C++0x中允许内联定义吗?请尝试编译h-std=c++0x
…Kerrek SB:实际上我是用-std=c++0x编译的,因为我在其余的代码中使用了其他功能。你能试着把X
的类型改成std::string::iterator::distance\u type
?这应该没什么区别,但是你发布的代码对我来说很好。它对我来说很有用hgcc-O2
,而不是与gcc-O0
,因此这取决于编译器是否优化了对X的引用。AFAIK静态整型常量成员可以在类声明本身内初始化。代码发布的代码在VS2008和ideone上运行良好(gcc 4.3.4)谢谢,但我想知道为什么str[X]
即使没有外部定义也可以工作。@hrzap:您的代码可以与GCC 4.5.2和4.6.0、clang 2.9和ICC 11.1一起工作。如果静态数据成员是常量整型或常量枚举类型,则其在类定义中的声明可以指定常量初始值设定项,该初始值设定项应为整型常量表达式。在这种情况下,该成员可以ear在整型常量表达式中。如果在程序中使用该成员,则该成员仍应在名称空间范围中定义,并且名称空间范围定义不应包含初始值设定项。AFAIK静态整型常量成员可以在类声明本身中初始化。并且代码发布代码在VS2008和ideone上运行良好(gcc 4.3.4)谢谢你这么做,但我想知道为什么str[X]
即使没有外部定义也可以工作。@hrzap:您的代码可以与GCC 4.5.2和4.6.0、clang 2.9和ICC 11.1一起工作。如果静态数据成员是常量整型或常量枚举类型,则其在类定义中的声明可以指定常量初始值设定项,该初始值设定项应为整型常量表达式。在这种情况下,该成员可以ear在整型常量表达式中。如果在程序中使用该成员,则该成员仍应在名称空间范围中定义,并且名称空间范围定义不应包含初始值设定项。