::func未被声明为错误
::func has not been declared error
我想做的基本上是能够调用一个函数,并让它注册一个c++函数与lua。基本上类似于registerFunction(function)。现在,我知道有一些库可以为你做这些,但是我想学习如何编写这样的库。
我目前的方法是使用模板为传递给它的函数生成相关的glue函数。
我的代码现在看起来像这样:
template<typename F>
struct registerStruct
{
template<typename T>
struct inner
{
static int func(lua_State*);
};
};
template<typename F>
void registerFunction(const char *name,F function)
{
lua_register(this->L,name,®isterStruct<decltype(function)>::inner<function>::func);
}
template<typename F>
struct registerStruct<F(void)> //I would write more classes for different numbers of arguments
{
template<F(*T)(void)>
struct inner
{
static int func(lua_State *L)
{
returnLua(L,T()); //push the return value onto lua's stack
return 1;
}
};
};
然后我试着这样使用它:
int test(void)
{
std::cout<<"hello from c++"<<std::endl;
return 0;
}
registerFunction("test",test);
使用gcc编译会产生错误::func未被声明。
registerStruct<decltype(function)>::inner<function>::func
一方面,decltype(function)
可以用F
代替。
同样,类模板inner
需要一个类型作为它的模板参数,而function
是一个表达式,而不是类型。应该是::inner<F>
。
(或者inner
根本不需要是模板。嵌套类outer<T>::inner
仍然可以使用附加在其封闭类上的模板形参T
。
c++语法需要一些奇怪的东西来帮助解析器理解模板的含义。通常,c++的含义取决于标识符是用于变量(对象或引用)、类型还是模板。但是在模板中的::
或.
或->
之后,如果操作符左侧的类型取决于模板参数,则在初始解析过程中不可能弄清楚下一个名称是什么。如果你不帮它,语言会认为这个名字是一个变量。
c++认为registerStruct<decltype(function)>::inner
是一个变量。然后是小于运算符<
,后跟有效表达式function
,然后是大于运算符>
,然后是::func
。等等,根本没有::func
!
要指定inner
确实是一个模板,您需要
®isterStruct<F>::template inner<F>::func
相关文章:
- 错误:未在此范围内声明'reverse'
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 错误:"imread"未在此范围内声明
- 在气泡排序程序中未声明错误功能
- 使用全局声明的向量时,C++双重释放错误/损坏
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 类中的静态函数给出了错误:声明中的两种或多个数据类型
- 错误:声明冲突 - 指针不能是 int
- 收到 CUDA 错误"声明与以前的"variable_name"不兼容
- 错误:声明不声明
- Visual Studio 2010 链接器错误C++声明我从头文件创建的类时
- Cython 错误:声明不声明任何内容
- 错误"声明非模板函数"C++
- 无效地使用不完整的类型/前向错误声明.可能误用抽象类?(c++)
- 错误:声明冲突.用c++编译c代码
- C++错误:声明中存在显式限定
- else语句(C++)上的错误w/声明
- 初始化const类成员,错误:声明没有声明任何内容