我在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
}
我感谢任何帮助。提前谢谢。
答案 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];
//…
};