提问人:Kostas Prontis 提问时间:12/3/2017 最后编辑:Kostas Prontis 更新时间:12/3/2017 访问量:702
静态函数数组上未解析的外部符号
unresolved external symbol on static array of functions
问:
我在 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
}
我感谢任何帮助。提前致谢。
答:
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];
//…
};
评论
std::function