шаблон не в объеме - PullRequest
       1

шаблон не в объеме

0 голосов
/ 16 января 2011

Получил это в "char.h"

#ifndef _CHAR_H_
#define _CHAR_H_

#include <stdio.h>

template <unsigned int TChar>



class Char
{
public:
 Char(){ *m_data=0; m_len=-1; }

private:
  char m_data[TChar+1];
 int m_len;
}; 

#endif

Теперь с помощью этого простого теста:

#include "char.h"


void test(Char<TChar> &oo)
{
  //...
}


int main(int argc, char *argv[])
{
  Char<80> gg;

  return 0;
}

Я получаю с GCC: TChar не был объявлен в этой области!? Я не понимаю, декларация в .h ??

Спасибо ...

Ответы [ 3 ]

1 голос
/ 16 января 2011

Вы, похоже, не понимаете, что такое класс шаблона.Когда вы пишете:

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) { /* ... */ }
1 голос
/ 16 января 2011

Полная реализация класса шаблона должна быть в заголовке этого класса шаблона (в противном случае вы можете получить ошибку компоновщика).Компилятор должен иметь доступ ко всему определению шаблона (а не только к подписи), чтобы генерировать код для каждого экземпляра шаблона, поэтому вам нужно перенести определения функций в свой заголовок.( Модель включения ).

Вы правильно разместили определение.: -)

Однако в void test(Char<TChar> &oo) компилятор не знает, что такое TChar.Попробуйте добавить template <unsigned int TChar> выше определения

template <unsigned int TChar>
void test(Char<TChar> &oo){
  // ... stuff
}
0 голосов
/ 16 января 2011
void test(Char<TChar> &oo)
{
  //...
}

TChar не определено для этой функции для компиляции.Файл char.h не определяет TChar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...