昨天同事说,类里加了个静态的vector类型的公共成员后,在其他类里调用,操作该成员,编译出错。
1>d:\program files\microsoft visual studio 9.0\vc\include\xtree(1411) : error C2061: 语法错误: 标识符“_Wherenode”
1> d:\program files\microsoft visual studio 9.0\vc\include\xtree(1408): 编译类模板成员函数“std::_Tree_nod<_Traits>::_Node *std::_Tree<_Traits>::_Buynode(std::_Tree_nod<_Traits>::_Node *,std::_Tree_nod<_Traits>::_Node *,std::_Tree_nod<_Traits>::_Node *,const IgnoreCaseWString &,char)”时
1> with
1> [
1> _Traits=std::_Tset_traits<IgnoreCaseWString,std::less<IgnoreCaseWString>,std::allocator<IgnoreCaseWString>,false>
我的第一感觉就是:不可能吧!转过去看了看。
开始以为是vector使用的自定义类型的问题。换成更简单的set<int>试一下,依然如此。去掉静态声明后再试,还是这样。经过尝试发现,在定义该成员的类里的成员函数操作该成员就没问题,在其他类里直接操作该成员就报 xtree(1411) : error C2061: 语法错误: 标识符“_Wherenode”
看了xtree的对应代码,_Wherenode分明是在前2行声明且赋值的一个指针。当时想来想去也想不出啥原因。
今天CSDN再搜了一下,找到一个说法,是MFC的DEBUG_NEW导致的。
参见: http://blog.csdn.net/gzlyb/article/details/3028471
我验证了一下,果然如此。
原来 afx.h中定义了 #define DEBUG_NEW new(THIS_FILE, __LINE__) 和 #define THIS_FILE __FILE__
<stree>被包含的位置在DEBUG_NEW 之后,自然就不认识THIS_FILE了。