Разница между явной специализацией и обычными функциями при перегрузке функции шаблона

Я сегодня в ударе. Здесь идет n00b вопрос номер 7:

В чем разница между явной специализацией и обычными функциями, когда вы пытаетесь перегрузить шаблонную функцию?

В какой ситуации следует использовать явную специализацию? Я не совсем понимаю:

#include <iostream>

template <typename s> void test(s var1);
template <> void test<int>(int var1);

int main(){
    test(1);
    test(1.1);
    test("hello!!");
    return 0;
}

template <typename s> void test(s var1){
    std::cout << var1 << std::endl;
}

template <> void test<int>(int var1){
    std::cout << "int " << var1 << std::endl;
}

В отличие от:

#include <iostream>

template <typename s> void test(s var1);
void test(int var1);

int main(){
    test(1);
    test(1.1);
    test("hello!!");
    return 0;
}

template <typename s> void test(s var1){
    std::cout << var1 << std::endl;
}

void test(int var1){
    std::cout << "int " << var1 << std::endl;
}
13
задан Dante May Code 13 May 2011 в 03:38
поделиться