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

unresolved external symbol on static array of functions

提问人:Kostas Prontis 提问时间:12/3/2017 最后编辑:Kostas Prontis 更新时间:12/3/2017 访问量:702

问:

我在 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 
}

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

C++ 可视化工作室 未解析外部

评论

1赞 tambre 12/3/2017
请正确格式化问题的代码块。
0赞 macroland 12/3/2017
如果可能的话,为什么不使用。您的代码将更清晰、更易于阅读和调试。std::function
0赞 StoryTeller - Unslander Monica 12/3/2017
u 类中的数组声明不用于指向成员的指针。所以我不明白你为什么期望它们匹配。
0赞 Kostas Prontis 12/3/2017
我尝试了静态 int (Exada::*functions_array[MAX_FUNCTIONS + 2])(int);但仍然有错误

答:

1赞 user7860670 12/3/2017 #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

0赞 StoryTeller - Unslander Monica 12/3/2017 #2

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

不是全部。由于您没有指定您想要什么样的定义,这主要是一个有根据的猜测。但是,如果您碰巧想要一个指向非静态成员函数的指针的静态成员数组,则原始语法如下:

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];
//…
};