Доброго времени суток.
С C++ раньше дела имел очень мало, а шаблоны только изучаю. Вот какая проблема возникла.
Имеется шаблон класса XColumn<typename type> - некий контейнер для type. В нём имеется метод toString(), что-то возвращающий.
template<typename T>
class XColumn {
T ccc;
public:
const char * toString() const { return "foo"; }
};
Имеется шаблон для другого класса - Int<int size> - что-то вроде вектора фиксированного размера.
template<int N>
struct Int {
int data[N];
};
Хочется поместить этот вектор в контейнер. Получается.
XColumn<Int<8> > c3;
Но проблема в том, что стандартный шаблонный метод toString() для вектора не подходит, нужна специализация. Пишу:
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> >
Смутно догадываюсь почему, но нет никаких идей как исправить. Возможно ли это вообще?
Полный код:
+ |
#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;
}
|