在一个头文件中,我有一个内联函数定义如下:
extern CMODEXPORT int FMI_invoke_delete_as_class
(
FEATURE_RECORD_p_t frec, /* I: Feature record */
FMI_delete_fn_p_t fn /* I: Function pointer */
);
template<class T>
inline int FMI_invoke_delete_as_class(FEATURE_RECORD_p_t frec) // I: Feature record
{
class FMIHelper
{
public:
static int DeleteParms(FEATURE_RECORD_p_t frec)
{
//....
return error;
}
};
return FMI_invoke_delete_as_class(frec, &FMIHelper::DeleteParms);
}
在最后一行,有一个FMI_invoke_delete_as_class
的电话
此函数在另一个.c文件中定义,如
extern int FMI_invoke_delete_as_class
(
FEATURE_RECORD_p_t frec, /* I: Feature record */
OM_class_t class_id /* I: Object class */
)
{
//...
}
extern int FMI_invoke_delete_as_class
(
FEATURE_RECORD_p_t frec, /* I: Feature record */
FMI_delete_fn_p_t fn /* I: Function pointer */
)
如果头文件中的FMI_invoke_delete_as_class声明在我发布的内联函数之前,则内联函数的调用是可以的。但是,如果我在该内联函数之后放置该声明,则会在.c文件中调用错误的函数。 我不知道为什么,只是在linux下发生。
答案 0 :(得分:0)
我尝试使用以下代码:
/** kk.h */
#include <iostream>
struct FEATURE_RECORD_p_t
{
int kk;
};
template<class T>
inline int FMI_invoke_delete_as_class(FEATURE_RECORD_p_t frec) // I: Feature record
{
class FMIHelper
{
public:
static int DeleteParms(FEATURE_RECORD_p_t frec)
{
//....
std::cout << "DeleteParms" << std::endl;
frec.kk = 100;
return frec.kk;
}
};
std::cout << "FMI_invoke_delete_as_class<>" << std::endl;
return FMI_invoke_delete_as_class(frec, &FMIHelper::DeleteParms);
}
typedef int (*FMI_delete_fn_p_t)(FEATURE_RECORD_p_t);
extern int FMI_invoke_delete_as_class
(
FEATURE_RECORD_p_t frec, /* I: Feature record */
FMI_delete_fn_p_t fn /* I: Function pointer */
);
和
#include "kk.h"
extern int FMI_invoke_delete_as_class
(
FEATURE_RECORD_p_t frec, /* I: Feature record */
int class_id /* I: Object class */
)
{
std::cout << "FMI_invoke_delete_as_class (bad)" << std::endl;
return 0;
}
extern int FMI_invoke_delete_as_class
(
FEATURE_RECORD_p_t frec, /* I: Feature record */
FMI_delete_fn_p_t fn /* I: Function pointer */
)
{
std::cout << "FMI_invoke_delete_as_class" << std::endl;
return fn(frec);
}
int main()
{
FEATURE_RECORD_p_t kk;
FMI_invoke_delete_as_class<int>(kk);
return 0;
}
并打印结果为:
FMI_invoke_delete_as_class<>
FMI_invoke_delete_as_class
DeleteParms
它接缝好了。你如何调用内联函数?你的类型定义如何?你的编译命令是哪个?我正在使用g++ (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
g++ -g -o kk kk.cpp
命令行