Другие языки программирования и технологии

не получается создать специализацию (спец ф-ию) в codeblocks 10,05. C++

Читаю "язык программирования С++" Прата С. Там есть пример с перегрузкой ф-ии swap. Точнее говоря, с перегрузкой шаблона, обыной ф-ии и специализации. Решил опробовать пример, когда специализация "перекрывает" шаблон. вот код:

#include <iostream>

using namespace std;

template <> void func__ <int&> (int &x, int &y) //спец-функция
{
cout << "i am a spetialization func with arguments (int &x, int &y)";
}

template <type> void func__ (type &x, type &y) //шаблон
{
cout << "i am a template func with arguments (type &x, type &y)";
}

int main ()
{
int a, b;
func__ (a, b);
}

Все время сталкиваюсь с ошибкой компилятора (в строке, где я объявляю специализацию) : expected initializer before '<' token;
Про какую инициализацию он говорит? Я уже и пробовал и < > убирать и вставлять их в разных частях объявления - нарывался только на новые ошибки. Может моя ошибка где-то в ситаксисе? инет перерыл по этому вопросу, даже на сайт кодеблокс зашел - ничего не нашел. Помогите пожалуйста правильно написать компилирующуюся специализацию функции в среде codeblocks.

И еще. То, что существует иерархия наложения (специализация перекрывает шаблон, а обычная ф-ия перекрывает и шаблон и специализацию) я понял. Очевидны преимущества шаблона. Но зачем специализации, если можно создать обычную ф-ию?
Pasha
Pasha
287
#include <iostream>
using namespace std;
void func__(int &x, int &y) //спец-функция
{
cout << "i am a spetialization func with arguments (int &x, int &y)";
}
template <class> void func__ (type &x, type &y) //шаблон
{
cout << "i am a template func with arguments (type &x, type &y)";
}
int main ()
{
int a, b;
func__ (a, b);
float x, y;
func__ (x, y);
}
Р!
Рома !!!
76 473
Лучший ответ
Вот код, который работает:
#include "stdafx.h"
#include < iostream >
using namespace std;
void func__(int &x, int &y) //спец-функция
{
cout < < "i am a spetialization func with arguments (int &x, int &y)" < < endl;
}
template < class type > void func__ (type &x, type &y) //шаблон
{
cout < < "i am a template func with arguments (type &x, type &y)" < < endl;
}

int _tmain(int argc, _TCHAR* argv [ ] )
{
int a, b;
func__ (a, b);
float x, y;
func__ (x, y);
int a1, b1;
func__ (a1, b1);

return 0;
}
Но это еще не специализация. Специализаия изпользует следующий код:
template < > void func__<int>(int &x, int &y) //спец-функция
{
cout < < "i am a REAL spetialization func with arguments (int &x, int &y)" < < endl;
}
Ноэто только в новых компиляторах!
Виктор Каплун
Виктор Каплун
35 996