静态函数数组上未解析的外部符号

时间:2017-12-03 10:08:44

标签: c++ visual-studio unresolved-external

我在Visual Studio中遇到了未解析的外部符号问题。 我已经尝试了定义的所有组合,但我仍然收到消息

1> Exada.obj:错误LNK2001:未解析的外部符号" public:static int(__ cdecl ** Exada :: functions_array)(int)" (?functions_array @ @@ Exada @ 2PAP6AHH ZA)

我的头文件Exada.h中的声明就像这样

const int MAX_FUNCTIONS=179;
class Exada
{
public:
static int (*functions_array[MAX_FUNCTIONS + 2])(int);
…
};

Exada.cpp文件中的定义是

int (Exada:: *functions_array[MAX_FUNCTIONS + 2])(int) = { NULL,
&Exada::aporipteos_ar, //1
&Exada::aporipteos_ar, //2
&Exada::aporipteos_ar, //3
… Some address of functions 
}

我感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:1)

处理指向函数的指针数组可能很麻烦。使用中间类型别名声明:

class Exada
{
  // if functions are supposed to be normal or static member functions
  using t_Method = int ( * )(int);
  // if functions are supposed to be non-static member functions
  using t_Method = int ( Exada::* )(int);

  using t_Methods = t_Method[MAX_FUNCTIONS + 2];

  static t_Methods functions_array;
};

// cpp
Exada::t_Methods Exada::functions_array = { nullptr,

最好使用::std::array包装器而不是原始数组。

答案 1 :(得分:0)

  

我已经尝试了定义的所有组合

不是全部。而且由于你没有指定你想要的定义,这大多是一个有根据的猜测。但是如果你碰巧想要一个指向非静态成员函数的静态成员数组,那么原始语法就是:

const int MAX_FUNCTIONS=179;
class Exada
{
public:
    static int (Exada::* functions_array[MAX_FUNCTIONS + 2])(int);
//…
};

并在您的实施文件中

// One `Exada::` for pointer-to-member and one for scope
int (Exada:: * Exada::functions_array[MAX_FUNCTIONS + 2])(int) = { NULL,
  &Exada::aporipteos_ar, //1
  &Exada::aporipteos_ar, //2
  &Exada::aporipteos_ar, //3
  //… Some address of functions 
}

这仍然是不可读的。因此,我建议使用类型别名来简化读写操作:

const int MAX_FUNCTIONS=179;
using member_type = int(int);
class Exada
{
public:
    static member_type Exada::*functions_array[MAX_FUNCTIONS + 2];
//…
};