powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не компилируется специализация шаблона
10 сообщений из 10, страница 1 из 1
Не компилируется специализация шаблона
    #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
Не компилируется специализация шаблона
    #38923104
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаблоны тут не нужны, наследования хватит за глаза.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не компилируется специализация шаблона
    #38923114
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_77m,

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

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

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


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