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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Частичная специализация методов в шаблоне класса, при более чем одном параметре шаблона 
:(
    Опции темы
jorikdima
Дата 23.6.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

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



Здравствуйте.
Читал, читал про специализацию, так и не осознал, как сделать.
Есть шаблон:
Код

template< class Tp , int Size>
class SomeTpl{
private:
    Tp var1[Size];
public:
    void some_op1();
    void some_op2();
    Tp getVar();
    };

В нем два параметра и это важно, ибо когда нету Size, а просто template< class Tp> то все компилируется.
Есть реализации:
Код

template< class Tp  , int Size>
Tp SomeTpl<Tp, Size>::getVar()
    {
    return var1[0];
    }

template< class Tp , int Size >
void SomeTpl<Tp, Size>::some_op1()
    {
    var1[0] = 1;
    }

template< class Tp , int Size >
void SomeTpl<Tp, Size>::some_op2()
    {
    var1[0] = 2;
    }


template<>
void SomeTpl<int, 6>::some_op1()
    {
    var1[1] = 3;
    }


Тут я попытался переопределить метод some_op1 для Tp являющегося int и для Size=6. Но!!! Я не хочу фиксировать реализацию (или как его там... инстантенацию) для фиксированного Size.  Хочу, чтобы писалось, что то типа
Код

template<class Tp , int Size>
void SomeTpl<int, Size>::some_op1()
    {
    var1[1] = 3;
    }

Но так не компилируется, а выдает кучу ошибок.
Как сделать частичную специализацию в моем случае?
Спасибо.

Это сообщение отредактировал(а) jorikdima - 23.6.2010, 11:44
PM MAIL   Вверх
azesmcar
Дата 23.6.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Код

#include <iostream>

template< class Tp , int Size>
class SomeTpl{
public:
    void foo()
    {
        std::cout << "A" << std::endl;
    };
};

template<>
void SomeTpl<int, 6>::foo()
{
    std::cout << "B" << std::endl;
}

int main()
{
    SomeTpl<int, 7> t1;
    t1.foo();
    SomeTpl<int, 6> t2;
    t2.foo();
}

?

Это сообщение отредактировал(а) azesmcar - 23.6.2010, 12:20
PM   Вверх
jorikdima
Дата 23.6.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

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



Цитата(azesmcar @ 23.6.2010,  12:19)
Код

template<>
void SomeTpl<int, 6>::foo()
{
    std::cout << "B" << std::endl;
}

?

В том то  и дело, что я не хочу переопределять инстантенацию для фиксированного Size, я это проблемой и обозначил. Я хочу чтоб Size оставался параметром шаблона.
PM MAIL   Вверх
azesmcar
Дата 23.6.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(jorikdima @  23.6.2010,  12:25 Найти цитируемый пост)
В том то  и дело, что я не хочу переопределять инстантенацию для фиксированного Size, я это проблемой и обозначил. Я хочу чтоб Size оставался параметром шаблона. 

Да, неверно понял вопрос. Тогда надо специализировать весь класс, частичной специализации функций нету.
Код

#include <iostream>

template<class Tp, int Size>
class SomeTpl{
public:
    void foo()
    {
        std::cout << "A" << std::endl;
    };
};

template<int Size>
class SomeTpl<int, Size>{
public:
    void foo()
    {
        std::cout << "B" << std::endl;
    };
};

int main()
{
    SomeTpl<float, 7> t1;
    t1.foo();
    SomeTpl<int, 6> t2;
    t2.foo();
}


Это сообщение отредактировал(а) azesmcar - 23.6.2010, 12:40
PM   Вверх
jorikdima
Дата 23.6.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

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



Понял, спасибо. Печально.
В случае специализации класса я обязан переписать вообще все методы класса, или только те, которые зависят от параметров шаблона? Если все вообще, то тут теряется смысл шаблона.
Странно почему нет частичной специализации... что мешало Страуструппу ее ввести?
PM MAIL   Вверх
azesmcar
Дата 23.6.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(jorikdima @  23.6.2010,  14:18 Найти цитируемый пост)
В случае специализации класса я обязан переписать вообще все методы класса, или только те, которые зависят от параметров шаблона? Если все вообще, то тут теряется смысл шаблона.

можно выкрутиться наследованием.

как-то так
Код

#include <iostream>

template<class T, int Size>
class SomeTplBase{
public:
    void foo1()
    {
        std::cout << "A" << std::endl;
    };
    void foo2()
    {
        std::cout << "B" << std::endl;
    };
};

template<class T, int Size>
class SomeTpl : public SomeTplBase<T, Size> {};

template<int Size>
class SomeTpl<int, Size> : public SomeTplBase<int, Size> {
public:
    void foo1()
    {
        std::cout << "C" << std::endl;
    };
};

int main()
{
    SomeTpl<float, 7> t1;
    t1.foo1();
    SomeTpl<int, 6> t2;
    t2.foo1();
}


Цитата(jorikdima @  23.6.2010,  14:18 Найти цитируемый пост)
Странно почему нет частичной специализации... что мешало Страуструппу ее ввести? 

Если я правильно помню у Саттера в решении сложных задач описано.

Это сообщение отредактировал(а) azesmcar - 23.6.2010, 14:45
PM   Вверх
jorikdima
Дата 23.6.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

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



azesmcar, спасибо. Понял идею.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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