Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Шаблонная функция в классе

13K
16 января 2007 года
Mad Kit
18 / / 19.07.2006
Вопрос в следующем. Почему на работает в 6-й студии такой код
class T1
{
public:
void F1();
template<class T> void F2();
template<class T> void F3(T a);

};

void T1::F1()
{
int a;
F3(a);
}

template<class T> void T1::F2()
{
T a;
}

template<class T> void T1::F3(T a)
{
}

void main()
{
T1 b;
b.F2<int>();
}

Ошибка выдается на строчке b.F2<int>(); error C2062: type 'int' unexpected
240
16 января 2007 года
aks
2.5K / / 14.07.2006
Потому что это 6-я студия, котороя во многом не поддерживает стандарт особенно по части шаблонов. А это так наверно самый известный баг.
Меняй компиялотор. В следующей версии студии такого нет.
8.8K
16 января 2007 года
The_Ice
109 / / 04.04.2006
Попробуй так:
Код:
template < class T>
class T1
{
  public:
    void F1( )
    {
      T a; //думаю здесь ты хотел T поставить, а не int
      F3( a);
    }
    void F2( )
    {
      T a;
    }
    void F3 ( T a)
    {
    }
};

int main( )
{
  T1< int> b;
  b. F2( );
}


Т.е. создавай шаблон класса, а не его функций
309
16 января 2007 года
el scorpio
1.1K / / 19.09.2006
Я прекрасно создавал в Builder 6.0 подобные методы.
 
Код:
template <class T> template <class X>
int __fastcall TtList<T>::Add (const X &Param)

То есть, чтобы создать шаблон конкретного метода класса, нужно, чтобы тип реализации шаблона определялся типом параметра.
3
16 января 2007 года
Green
4.8K / / 20.01.2000
Цитата: The_Ice

Т.е. создавай шаблон класса, а не его функций


Это не подходящее решение. Автору нужен шаблонный метод, а не класс.

[QUOTE=el scorpio]
То есть, чтобы создать шаблон конкретного метода класса, нужно, чтобы тип реализации шаблона определялся типом параметра.
[/QUOTE]
Такой нужды нет, если компилятор поддерживает стандарт в должной мере. В стандарте нигде не сказано, что "нужно, чтобы тип реализации шаблона определялся типом параметра".
Я поднимал как-то этот вопрос:
http://forum.codenet.ru/showthread.php?t=5001

Описанная автором проблема является, как уже сказал aks, недостатком VC 6.0 и прочих стареньких компиляторов.
Пути решения два:
1) использовать другой компилятор,
2) воспользоваться "хитростью" с передачей вцелом ненужного параметра:

Код:
class T1
{
public:
    template<class T> void F2(T);

};

void main()
{
    T1 b;
    b.F2( (int)0 );
}


P.S. Mad Kit, пользуйся тегом [сode].......[/сode] для кода.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог