Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Специализация шаблона функции по параметру шаблона, Невозможна? 
:(
    Опции темы
WhKitten
Дата 17.4.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Предположим я хочу создать шаблон, который создаёт некоторый объект с некоторым значением по умолчанию.
Код

template<typename T>
T createObject() { return T(); }


Я хочу определить для него специализацию, для указателя на int:
Код

template<>
int* createObject() { return new int(1000); }


А теперь хочу вообще определить специализацию для любого указателя:
Код

template<typename T>
T* createObject() { return new T(); }


Код

int main()
{
    int i = createObject<int>(); // работает
    int* pi = createObject<int*>(); // работает
    double* pd = createObject<double*>(); // не работает
    return 0;
}


Т.е определить специализацию для любого указателя в данном случае невозможно?
PM MAIL   Вверх
asmdzen
Дата 17.4.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



 насколько я помню нужно сперва специализацию для всех указателей писать а потом для отдельных типов.
PM MAIL   Вверх
WhKitten
Дата 17.4.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Код

#include <iostream>

template<typename T>
T createObject() { return T(); }

template<typename T>
T* createObject() { return new T(); }

int main()
{
    double* pd = createObject<double*>();
}



Цитата
1>main.cpp(11): error C2668: 'createObject' : ambiguous call to overloaded function
1>          main.cpp(7): could be 'T *createObject<double*>(void)'
1>          with
1>          [
1>              T=double *
1>          ]
1>          d:\documents\visual studio 2010\projects\test\test\main.cpp(4): or       'T createObject<double*>(void)'
1>          with
1>          [
1>              T=double *
1>          ]
1>          while trying to match the argument list '(void)'

PM MAIL   Вверх
asmdzen
Дата 17.4.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Код

template<typename T>
T* createObject() { return new T(); }

здесь кое-чего не хватает, или я не понял, вроде должно быть так:
Код

template<typename T>
T* createObject<T*>() { return new T(); }

но такая специализация для функций запрещена, вот что я нашел по этой теме:
Код

#include <iostream>
#include <ostream>

using namespace std;

template < int N, typename T>
struct do_norm{ static double apply( T const &t ){ return 0.0;}};

template < typename T >
struct do_norm< 2, T >{static double apply( T const &t ){return 2.0;}};

template < int N, typename T>
double norm( T const &t ){return do_norm< N, T >::apply( t );}


struct A {};

int main()
{
    A a;
    cout << norm<2>(a) << endl;
    cout << norm<1>(1) << endl;
    return 0;
}

PM MAIL   Вверх
WhKitten
Дата 17.4.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Т.е, вместо того, чтобы просто определить специализацию функции необходимо писать такой код smile
Код

#include <iostream>

template<typename T>
struct CreateObjectStruct {
    static T createObject() { return T(); }
};

template<typename T>
struct CreateObjectStruct<T*> {
    static T* createObject() { return new T(); }
};

template<>
struct CreateObjectStruct<int*> {
    static int* createObject() { return new int(1000); }
};

template<typename T>
T createObject() { return CreateObjectStruct<T>::createObject(); }

int main()
{
    int      i = createObject<int>();
    int*    pi = createObject<int*>();
    double* pd = createObject<double*>();
    return 0;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.