Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++ 静态数组为int的奇怪链接器错误_C++_C++11 - Fatal编程技术网

C++ 静态数组为int的奇怪链接器错误

C++ 静态数组为int的奇怪链接器错误,c++,c++11,C++,C++11,我试图用Clang3.0编译以下代码。 它无法链接,是我做错了什么,还是这是一个编译器错误 错误如下 架构x86_64的未定义符号: “uuu ZN9int_uuarrayijli2eli3eli4eli5eli6eli7eli8eee4liste”, 引用自: __ZN9int_arrayijli0eli1eli2eli3eli4eli5eli6eli6eli7eli8eli8e5printev 在cc JDTbNl.o ld中:未找到架构x86_64的符号 代码如下 #include <

我试图用Clang3.0编译以下代码。 它无法链接,是我做错了什么,还是这是一个编译器错误

错误如下

架构x86_64的未定义符号:
“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中,任何文本常量静态成员都可以进行类内初始化。