linux 开发异常错误记录
-
error: using typedef-name `T' after `class'
template< typename T> class Factory { friend class T; }; class Foo { }; int main() { Factory< Foo > f; return 0; }
按照 http://stackoverflow.com/questions/6321191/using-friend-in-templates
提供的解决方案是:
使用间接方式:
template< typename T > class MakeFriend { public: typedef T Type; }; template< typename T > class Factory { public: friend class MakeFriend< T >::Type ; }; class Foo { }; int main() { Factory< Foo > f; return 0; }
-
error: expected `;' before "m_item"
-
error: ‘m_item’ was not declared in this scope
template< typename T> class SubTemplate { public: typedef T Type; }; template< typename T> class Wrapper { SubTemplate< T >::Type m_item ; }; class Foo { }; int main() { Wrapper< Foo> a; return 0; }
- 从属属性:在模板中依赖于一个template参数(也就是尖括号中typename后面的T啦)的属性(注意,是属性而不是成员哦)。
- 在使用从属属性的时候,应当在前面加上一个typename关键字,否则就会引发潜在的问题,如下所示。如果在T::someProperty前没有typename关键字,也许编译器会把声明指针用的*认为是用作乘法的乘号。
template <typename T> class C{ public: void f(){ typename T::someProperty* x; }; };
修改后将如:
template< typename T> class SubTemplate { public: typedef T Type; }; template< typename T> class Wrapper { typename SubTemplate< T >::Type m_item ; // modify this line }; class Foo { }; int main() { Wrapper< Foo> a; return 0; }
-
lua 栈溢出问题
程序老是自动访问冲突到某一行, 具体调用过程是 C 调用 lua 在调用 C ,在后面的 C 函数里有如
int CreateMonsters( lua_State* L) { for( int row = 0; ...) { for( int col = 0; ...) { int mapid = GetMapID( L); ... } } }
经常在调用 CreateMonsters() 函数的位置, 例如
{
...
CreateMonsters();
...
}
报访问冲突的错误, 即便在CreateMonsters() 内部加上通篇的 try-catch 也无法扑捉到, 函数尾部能够访问到, 就是推出函数时出错;按照以往经验估计是 栈溢出的问题, 才会如此的“粗暴”, 折腾了一番后, 发现时 int GetMapID( lua_State* L) 的问题:
int GetMapID( lua_State* L) { lua_pushnumber( L, m_mapid); return 1; }
row * col 次插入如此多的数据到 栈里, 并且是 多次的 C、lua嵌套调用, 有没有相应合理的 lua_pop( L, n)操作,当然导致某个时刻 从 C 到 lua 异常啦; 当然, 这也是错误使用 该函数, 该函数是给 lua 调用的, 并非给 C。