Вы, похоже, не понимаете, что такое класс шаблона.Когда вы пишете:
template <unsigned int TChar>
class Char
{
/* ... */
};
Вы говорите компилятору, как генерировать классы с именем Char<somenumber>
.Каждый раз, когда вы используете Char<1>
, Char<2>
, ... с другими параметрами где-то в вашем коде, компилятор создаст для вас новый класс.
Имя TChar
представляет только то значение, котороебыть заданным как часть имени типа и действительна только внутри шаблона вашего класса.
Это означает, что когда вы пишете Char<80>
, компилятор смотрит, имеет ли он уже этот тип - чего у него нет,поэтому он идет и создает новый класс с именем Char<80>
на основе вашего шаблона.Вот почему вы не можете написать функцию, которая принимает любой Char , потому что Char<80>
и Char<81>
- это разные типы.
То, что другие предлагают, это то, что вы можете превратить свою функцию вшаблон функции.
// compiler can't know what value should be used here
// it expects an unsigned int inside <>
void test(Char<TChar> &oo)
{
//...
}
С шаблонами функций он работает так же, как с классами.
template<unsigned int TChar>
void test(Char<TChar> &oo)
{
//...
}
Теперь, когда вы пишете
Char<80> gg;
test(gg);
Компилятор смотрит натипа gg, видит, что он может сопоставить его с вашим шаблоном функции, создает функцию с TChar
, оцененной как 80, и все работает хорошо:)
Если быть точным, вызов вашей функции должен выглядеть следующим образомэто:
test<80>(gg);
, но вам не нужно говорить это явно, потому что у компилятора достаточно информации типа gg
, чтобы решить все это за вас.
Если вы хотите передать Char
экземпляров не шаблонным функциям, вы можете достичь этого с помощью полиморфизма, подобного следующему:
class CharBase {
public:
virtual char get(int index) = 0;
virtual ~CharBase() {} // virtual destructor is strongly recommended
};
template<unsigned int CharT>
class Char : public CharBase {
public:
char get(int index) { return m_data[index]; }
/* ... */
};
void test(CharBase &myChar) { /* ... */ }