C++ 静态数组为int的奇怪链接器错误
我试图用Clang3.0编译以下代码。 它无法链接,是我做错了什么,还是这是一个编译器错误 错误如下 架构x86_64的未定义符号:C++ 静态数组为int的奇怪链接器错误,c++,c++11,C++,C++11,我试图用Clang3.0编译以下代码。 它无法链接,是我做错了什么,还是这是一个编译器错误 错误如下 架构x86_64的未定义符号: “uuu ZN9int_uuarrayijli2eli3eli4eli5eli6eli7eli8eee4liste”, 引用自: __ZN9int_arrayijli0eli1eli2eli3eli4eli5eli6eli6eli7eli8eli8e5printev 在cc JDTbNl.o ld中:未找到架构x86_64的符号 代码如下 #include <
“uuu ZN9int_uuarrayijli2eli3eli4eli5eli6eli7eli8eee4liste”, 引用自: __ZN9int_arrayijli0eli1eli2eli3eli4eli5eli6eli6eli7eli8eli8e5printev 在cc JDTbNl.o ld中:未找到架构x86_64的符号 代码如下
#include <iostream>
static const int a[] = {0,1,2,3,4,5,6,7,8};
template<int... Numbers> struct int_array;
template<int... Numbers>
struct int_array {
int x;
const static int list[] = {Numbers...};
static void print() {
for (const int x : list) {
std::cout << x <<std::endl;
}
}
static void print2() {
for (const int x : a) {
std::cout << x <<std::endl;
}
}
};
typedef int_array<0,1,2,3,4,5,6,7,8> array_of_ints;
int main (int argc, const char * argv[])
{
array_of_ints::print();
array_of_ints::print2();
return 0;
}
#包括
静态常数inta[]={0,1,2,3,4,5,6,7,8};
模板结构int_数组;
模板
结构整数数组{
int x;
常量静态整数列表[]={Numbers…};
静态无效打印(){
用于(常量int x:列表){
std::cout我对c++0x一点也不是专家,希望有更有知识的人来这里……但是c++0x允许静态成员的类内初始化吗?如果是这样,clang只是还没有实现它。如果不是,你不能。
,9.4.2第3项,说任何常量文本类型都可以初始化;3.9第10项说int数组是一个文本。所以,我想这是clang 3.0的一个错误,但在可变模板的情况下可能有进一步的规则
不管怎样,按如下方式更改代码对我很有效:
template<int... Numbers>
struct int_array {
int x;
const static int list[];
static void print() ;
};
template<int... Numbers>
const int int_array<Numbers...>::list[]={Numbers...};
template<int... Numbers>
void int_array<Numbers...>::print(){
for (const int x : list) {
std::cout << x <<std::endl;
}
}
模板
结构整数数组{
int x;
常量静态整数列表[];
静态无效打印();
};
模板
常量int_数组::列表[]={Numbers…};
模板
void int_数组::print(){
用于(常量int x:列表){
std::cout我对c++0x一点也不是专家,希望有更有知识的人来这里……但是c++0x允许静态成员的类内初始化吗?如果是这样,clang只是还没有实现它。如果不是,你不能。
,9.4.2第3项,说任何常量文本类型都可以初始化;3.9第10项说int数组是一个文本。所以,我想这是clang 3.0的一个错误,但在可变模板的情况下可能有进一步的规则
不管怎样,按如下方式更改代码对我很有效:
template<int... Numbers>
struct int_array {
int x;
const static int list[];
static void print() ;
};
template<int... Numbers>
const int int_array<Numbers...>::list[]={Numbers...};
template<int... Numbers>
void int_array<Numbers...>::print(){
for (const int x : list) {
std::cout << x <<std::endl;
}
}
模板
结构整数数组{
int x;
常量静态整数列表[];
静态无效打印();
};
模板
常量int_数组::列表[]={Numbers…};
模板
void int_数组::print(){
用于(常量int x:列表){
std::cout您的代码错误有两个原因
- 如果类中的静态数据成员不是整数或枚举类型,并且不是
constexpr
- 您缺少
int\u array::list
的定义。由于您是使用该成员的odr,因此需要对其进行定义
这不是一个铿锵bug。一旦铿锵得到constexpr
支持,然后添加out类的定义(不能有初始值设定项),正如您在类中已经提供的那样,并用constexpr
替换const
,代码应该可以正常工作
对于一般公众来说,.您的代码错误有两个原因
- 如果类中的静态数据成员不是整数或枚举类型,并且不是
constexpr
- 您缺少
int\u array::list
的定义。由于您是使用该成员的odr,因此需要对其进行定义
这不是一个铿锵bug。一旦铿锵得到constexpr
支持,然后添加out类的定义(不能有初始值设定项),正如您在类中已经提供的那样,并用constexpr
替换const
,代码应该可以正常工作
对于一般公众,.我认为类内初始化只允许静态常量整型成员。感谢您对此的回复,我将尽可能将此错误提交给clangguys@Kerek我想这就是C++03中的情况。在C++11中,对任何文本常量静态成员进行类内初始化是可以的。我认为是在C中lass初始化只允许静态常量整型成员。感谢您对此的回复,我将尽可能将此错误提交给clangguys@Kerek我认为,在C++03中就是这种情况,在C++11中,任何文本常量静态成员都可以进行类内初始化。