在使用std::vector的過程中,考試大提示編譯器報了如下的warning:
c:\program files\vc98\include\vector(61) : warning C4786: '??0?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@QAE@PBV?$basic_string@DU?$char_t
raits@D@std@@V?$allocator@D@2@@1@0ABV?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@1@@Z : identifier was truncated to '255' characters in the browser information
d:\rtd\ruleloader\treenode.h(15) : see reference to class template instantiation 'std::vector,class std::allocator >,class std::allocator d::char_traits,class std::allocator > > >' being compiled
此warning產生的原因是因為標識符過長,超過了限定255個字。例如:
#define a_really_long_class_name a_really_really_really_really_really_really_really_ \
really_really_really_really_really_really_really_really_really_really_really_really_ \
really_really_really_really_really_really_really_really_really_really_really_really_really_really_really
class a_really_long_class_name
{
public:
a_really_long_class_name() {};
int m_data;
};
void main()
{
a_really_long_class_name test_obj;
test_obj.m_data = 12;
}
類名超過了255個字,使用時就會報4786的waring。在使用STL(C++標準模板庫)的時候經常引發(fā)類似的錯誤,尤其是vector,map這類模板類,模板中套模板,一不小心就超長了。例如:
template
class VeryLongClassNameA{};
template
class VeryLongClassNameB{};
template
class VeryLongClassNameC{};
template
class VeryLongClassNameD{};
class SomeRandomClass{};
typedef VeryLongClassNameD ClassD ;
typedef VeryLongClassNameC ClassC;
typedef VeryLongClassNameB ClassB;
typedef VeryLongClassNameA ClassA;
void SomeRandomFunction(ClassA aobj){}
void main()
{
ClassA AObj ;
SomeRandomFunction(AObj) ;
}
解決方法有兩種,一種是直接定義別名:
#ifdef _DEBUG
#define VeryLongClassNameA A
#define VeryLongClassNameB B
#endif
另一種是屏蔽4786warning:
#pragma warning(disable : 4786)
注意屏蔽語句必須放在報錯的模板類的引用聲明(如#include )之前,否則還是不起作用。
c:\program files\vc98\include\vector(61) : warning C4786: '??0?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@QAE@PBV?$basic_string@DU?$char_t
raits@D@std@@V?$allocator@D@2@@1@0ABV?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@1@@Z : identifier was truncated to '255' characters in the browser information
d:\rtd\ruleloader\treenode.h(15) : see reference to class template instantiation 'std::vector,class std::allocator >,class std::allocator d::char_traits,class std::allocator > > >' being compiled
此warning產生的原因是因為標識符過長,超過了限定255個字。例如:
#define a_really_long_class_name a_really_really_really_really_really_really_really_ \
really_really_really_really_really_really_really_really_really_really_really_really_ \
really_really_really_really_really_really_really_really_really_really_really_really_really_really_really
class a_really_long_class_name
{
public:
a_really_long_class_name() {};
int m_data;
};
void main()
{
a_really_long_class_name test_obj;
test_obj.m_data = 12;
}
類名超過了255個字,使用時就會報4786的waring。在使用STL(C++標準模板庫)的時候經常引發(fā)類似的錯誤,尤其是vector,map這類模板類,模板中套模板,一不小心就超長了。例如:
template
class VeryLongClassNameA{};
template
class VeryLongClassNameB{};
template
class VeryLongClassNameC{};
template
class VeryLongClassNameD{};
class SomeRandomClass{};
typedef VeryLongClassNameD ClassD ;
typedef VeryLongClassNameC ClassC;
typedef VeryLongClassNameB ClassB;
typedef VeryLongClassNameA ClassA;
void SomeRandomFunction(ClassA aobj){}
void main()
{
ClassA AObj ;
SomeRandomFunction(AObj) ;
}
解決方法有兩種,一種是直接定義別名:
#ifdef _DEBUG
#define VeryLongClassNameA A
#define VeryLongClassNameB B
#endif
另一種是屏蔽4786warning:
#pragma warning(disable : 4786)
注意屏蔽語句必須放在報錯的模板類的引用聲明(如#include )之前,否則還是不起作用。

