我想将一个公共typedef
添加到模板中,以获取指向使用“C”语言链接的函数take-one-argument的指针。
我试过了:
extern "C" {
template <typename return_t_, typename arg1_t_>
struct test
{
typedef return_t_ (*C_fun1_t)(arg1_t_);
};
}
和
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" {
typedef return_t_ (*C_fun1_t)(arg1_t_);
}
};
和
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" typedef return_t_ (*C_fun1_t)(arg1_t_);
};
没有成功。
我想要完成的是什么?
答案 0 :(得分:10)
C ++ 03,§7.5p4:
链接规范只应在命名空间范围内进行。 ...对于类成员的名称和类成员函数的成员函数类型,将忽略C语言链接。
不幸的是,你在当前的C ++中根本无法做到这一点。这个文本在最新的C ++ 0x草案中没有改变,但是“template typedefs”可能能够实现它。
答案 1 :(得分:1)
考虑typedef
的{{1}}或STL函数对象...如果您考虑一下,您也无法在extern“C”块中定义模板,原因很明显。
答案 2 :(得分:0)
如果我只是从你的typedef中省略extern "C"
,那么对我来说似乎一切正常。也就是说,以下编译,链接和运行没有警告,错误或问题:
foo.c的:
#include <stdio.h>
int foo(int x) {
return printf("%x\n", x);
}
TEST.CPP:
extern "C" int foo(int);
template <typename return_t_, typename arg1_t_>
struct test
{
typedef return_t_ (*C_fun1_t)(arg1_t_);
C_fun1_t myFn;
};
int main() {
test<int, int> t;
t.myFn = foo;
return t.myFn(5);
}
对于C ++大师:我不知道C链接与C ++的区别所在。在这样一个简单的例子中是否存在任何隐藏的问题?