Ошибка специализации шаблона функции?

#include <iostream>
template <class T> 
void foo(T) {
    std::cout << "foo(T)" << std::endl;
}

template <class T> 
void foo(T*) { //#3
    std::cout << "foo(T*)" << std::endl;
}

#define TEST

#ifdef TEST
template <> 
void foo(int*) { //#1
    std::cout << "foo(int*)" << std::endl;
}
#else
template <>
void foo<int*>(int*) { //#2
    std::cout << "foo<int*>(int*)" << std::endl;
}
#endif

int main(int argc, char **argv) {
    int* p = 0;
    foo(p);
    return 0;
}

в чем разница между # 1 и # 2. Если я определю ТЕСТ, работа №1. Но если я это прокомментирую, # 3 работа ... И как правильно написать специализацию шаблона функции ...

7
задан Xiaotian Pei 21 January 2012 в 11:45
поделиться