更新 2
好的,解决了第二个问题。如前所述,在尝试ReturnType(Args...)
匹配ReturnType (*)(Args..)
. 明显的解决方法是:
template <typename F, F *fn>
void doSomething() {
function_helper<F>::template toNative<fn>();
}
它现在在 clang++ 下编译。
更新
正如所指出的,我之前的代码有问题,我试图将函数参数传递给模板参数。然而,这被解析错误的奇怪错误所掩盖。错误地传递函数参数不应该导致我看到的错误。
事实证明,问题在于调用类的模板化成员函数的新语法(请参阅http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a .doc/language/ref/keyword_template_qualifier.htm)。
正确的语法应该是:
template <typename F, F *fn>
void doSomething() {
native_function native = function_helper<decltype(fn)>::template toNative<fn>();
}
其中必须在'::'和函数之间插入模板。
不幸的是,这是一个非常困难的问题搜索:(a)编译器错误完全没有帮助,并且(b)没有明显的搜索词可以使用。
此外,目前这似乎不适用于当前版本的 clang++,也不适用于 g++ 4.6(到目前为止,我得到另一个语法错误或内部编译器错误)。
原始问题
在我之前的问题的后续行动中,我有以下代码:
template <typename T>
struct function_helper {};
template <typename ReturnType, typename... Args>
struct function_helper<ReturnType(Args...)> {
// wraps actual function in a native-c function (allow it to be called
// via an external scripting language API)
template <ReturnType (*fn)(Args...)>
static native_function toNative() {
return [](State *state) -> int {
Context ctx(state);
return apply_helper<sizeof...(Args)>::apply(ctx, fn);
};
}
};
我想用它来包装:
template <typename ReturnType, typename... Args>
native_function function_(Context &ctx, const std::string &name, ReturnType (*fn)(Args...)) {
ctx.registerFn(name, function_helper<decltype(fn)>::toNative<fn>());
}
但是,这给了我一个“解析错误”。如果我不尝试将它包装在一个函数中,而是这样做:
int main(int argc, char **argv) {
// ...
ctx.registerFn("myFunc", function_helper<decltype(myFunc)>::toNative<myFunc>());
}
一切都编译并正确运行。同样,如果我使用宏,它也可以工作。但是,出于设计原因,我更愿意使用函数。
我还尝试了一种稍微不同的配方,结果相同:
template <typename T>
struct function_args {};
template <typename ReturnType, typename... Args>
struct function_args<ReturnType (*)(Args...)> {
const int size = sizeof...(Args);
};
template <typename F, F *fn>
native_function wrap() {
return [](State *state) -> int {
Context ctx(state);
return apply_helper<function_args<decltype(fn)>::size>::apply(ctx, fn);
};
}
我做错了什么,还是编译器问题?解析错误让我怀疑是编译器有问题。
我可以通过向 toNative() 添加参数来消除解析错误。但是,这只是导致了一个不同的错误,即没有这样的方法 toNative(int)。
我正在使用 xcode 附带的最新 clang++(基于 LLVM 3.1svn)。