STL源码剖析里的,不明白编译为什么错,该怎么处理

STL源码剖析里的,不明白编译为什么错
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包含了不少文件,你挨个找