STL源码剖析里的,不明白编译为什么错,该怎么处理
STL源码剖析里的,不明白编译为什么错
malloc.cpp
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(6) : warning C4005: “_THROW_BAD_ALLOC”: 宏重定义
d:\microsoft visual studio 8\vc\include\yvals.h(780) : 参见“_THROW_BAD_ALLOC”的前一个定义
============ 不明白,之前都有!defined() 判断过。竟然还会重定义
下面的错也不知道为什么?
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2143: 语法错误 : 缺少“)”(在“<”的前面)
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2143: 语法错误 : 缺少“;”(在“<”的前面)
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2988: 不可识别的模板声明/定义
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2059: 语法错误 : “<”
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2039: “__malloc_alloc_oom_handler”: 不是“`global namespace'”的成员
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2059: 语法错误 : “)”
------解决方案--------------------
VS2005,在yvals.h中定义了_THROW_BAD_ALLOC,该文件被iostream所引用,所以避过了判断。
以下代码可获得楼主希望的效果(顺便修改了一些笔误,呵呵)。
- C/C++ code
#if 0 #include <new> #define _THROW_BAD_ALLOC thow bad_aloc #elif !defined(_THROW_BAD_ALLOC) #include <iostream> #define _THROW_BAD_ALLOC cerr<<"out of memory"<<endl;exit(0); #endif template <int inst> class _malloc_alloc_template { private: static void* (*malloc_alloc_oom_handler)(); }; template<int inst> void (* __malloc_allloc_template<inst>::__malloc_alloc_oom_handler)() = 0; typedef __malloc_alloc_tempate<0> malloc_alloc;
malloc.cpp
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(6) : warning C4005: “_THROW_BAD_ALLOC”: 宏重定义
d:\microsoft visual studio 8\vc\include\yvals.h(780) : 参见“_THROW_BAD_ALLOC”的前一个定义
============ 不明白,之前都有!defined() 判断过。竟然还会重定义
下面的错也不知道为什么?
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2143: 语法错误 : 缺少“)”(在“<”的前面)
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2143: 语法错误 : 缺少“;”(在“<”的前面)
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2988: 不可识别的模板声明/定义
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2059: 语法错误 : “<”
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2039: “__malloc_alloc_oom_handler”: 不是“`global namespace'”的成员
e:\test_malloc_clloc_template\test_malloc_clloc_template\malloc.cpp(50) : error C2059: 语法错误 : “)”
------解决方案--------------------
VS2005,在yvals.h中定义了_THROW_BAD_ALLOC,该文件被iostream所引用,所以避过了判断。
以下代码可获得楼主希望的效果(顺便修改了一些笔误,呵呵)。
- C/C++ code
#if 0 #include <new> #define _THROW_BAD_ALLOC thow bad_aloc #elif !defined(_THROW_BAD_ALLOC) #include <iostream> #if !defined(_THROW_BAD_ALLOC) #define _THROW_BAD_ALLOC cerr<<"out of memory"<<endl;exit(0); #endif #endif template <int inst> class __malloc_alloc_template { private: static void* (*malloc_alloc_oom_handler)(); }; template<int inst> void* (* __malloc_alloc_template<inst>::malloc_alloc_oom_handler)() = 0; typedef __malloc_alloc_template<0> malloc_alloc;
------解决方案--------------------
你用/P这个编译选项展开看看
iostream包含了不少文件,你挨个找