Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется специализация шаблона / 10 сообщений из 10, страница 1 из 1
31.03.2015, 19:22
    #38923098
Serg_77m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Доброго времени суток.

С C++ раньше дела имел очень мало, а шаблоны только изучаю. Вот какая проблема возникла.
Имеется шаблон класса XColumn<typename type> - некий контейнер для type. В нём имеется метод toString(), что-то возвращающий.
Код: plaintext
1.
2.
3.
4.
5.
6.
template<typename T>
class XColumn {
  T ccc;
public:
  const char * toString() const { return "foo"; }
};


Имеется шаблон для другого класса - Int<int size> - что-то вроде вектора фиксированного размера.
Код: plaintext
1.
2.
3.
4.
template<int N>
struct Int {
  int data[N];
};


Хочется поместить этот вектор в контейнер. Получается.
Код: plaintext
1.
XColumn<Int<8> > c3;


Но проблема в том, что стандартный шаблонный метод toString() для вектора не подходит, нужна специализация. Пишу:
Код: plaintext
1.
2.
template<int N>
const char * XColumn<Int<N> >::toString() const { return "I'm is int<N>"; }


И вот тут компилятор (g++ 4.4.0) выдаёт ошибку: Invalid use of incomplete type 'class XColumn<Int<N> >
Смутно догадываюсь почему, но нет никаких идей как исправить. Возможно ли это вообще?

Полный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
#include <stdio.h>

template<typename T>
class XColumn {
  T ccc;
public:
  const char * toString() const { return "foo"; }
};

template<int N>
struct Int {
  int data[N];
};

template<>
const char * XColumn<double>::toString() const { return "I'm is double"; }

template<int N>
const char * XColumn<Int<N> >::toString() const { return "I'm is int<N>"; }

int main() {
  XColumn<int> c1;
  XColumn<double> c2;
  XColumn<Int<8> > c3;

  printf("%s\n", c1.toString());
  printf("%s\n", c2.toString());
  printf("%s\n", c3.toString());

  return 0;
}

...
Рейтинг: 0 / 0
31.03.2015, 19:31
    #38923104
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Шаблоны тут не нужны, наследования хватит за глаза.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.03.2015, 19:41
    #38923114
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Serg_77m,

для начала ты не то параметризируешь....
...
Рейтинг: 0 / 0
31.03.2015, 19:54
    #38923120
Serg_77m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Dimitry SibiryakovШаблоны тут не нужны, наследования хватит за глаза.
Это упрощённый тестовый пример. На самом деле XColumn наследуется от абстрактного класса, содержит десяток виртуальных методов и в качестве контейнера использует около десятка разных типов. И почти все методы ко всем типам подходят. Кроме шаблонного Int<N>, для которого пара методов нужна другая. Практически задача решается клонированием шаблона XColumn<typename T> в шаблон XColumnInt<int N> и дублированием всех методов с модификацией нужных. Их не так-то и много. Интерес скорее академический: что не так и как ещё можно решить?
...
Рейтинг: 0 / 0
31.03.2015, 22:27
    #38923219
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Serg_77m,

Перед определением метода специализированного класса вам надо написать определение самой этой специализации.
...
Рейтинг: 0 / 0
31.03.2015, 22:28
    #38923221
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Т.е. вы не можете специализировать только один метод - надо специализировать весь класс.
...
Рейтинг: 0 / 0
01.04.2015, 09:20
    #38923335
Serg_77m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Anatoly MoskovskyТ.е. вы не можете специализировать только один метод - надо специализировать весь класс.Хм... а специализацию toString() для double проглатывает... Или это нарушение стандарта?
...
Рейтинг: 0 / 0
01.04.2015, 10:03
    #38923389
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Serg_77mAnatoly MoskovskyТ.е. вы не можете специализировать только один метод - надо специализировать весь класс.Хм... а специализацию toString() для double проглатывает... Или это нарушение стандарта?
Я не совсем точно выразился.
Нельзя частично специализировать метод/функцию.
Полностью специализировать можно.
Полная специализация - это когда нет параметров:
Код: plaintext
1.
template<> ...
...
Рейтинг: 0 / 0
01.04.2015, 10:04
    #38923392
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Хотя некоторые компиляторы позволяют частичную специализацию функций, но gcc обычно строг ))
...
Рейтинг: 0 / 0
01.04.2015, 17:30
    #38924128
Serg_77m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не компилируется специализация шаблона
Anatoly MoskovskySerg_77mпропущено...
Хм... а специализацию toString() для double проглатывает... Или это нарушение стандарта?
Нельзя частично специализировать метод/функцию.
Полностью специализировать можно.
Полная специализация - это когда нет параметров:
Код: plaintext
1.
template<> ...

Ага, понятно. Спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется специализация шаблона / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]