Как иметь Struct с шаблоном с классом - PullRequest
5 голосов
/ 06 сентября 2010

С этим кодом (просто класс теста):

typedef unsigned short UInt16;

template<class T>
class CClass
{
public:
    SValue* getNewSValue(void);
private:
    typedef struct {
        T *mValue;
        T *next;
        T *previous;
        UInt16 index;
    } SValue;
};

template<typename T>
SValue* CClass<T>::getNewSValue(void)
{
    return new SValue;
}

У меня есть следующие ошибки:

ошибка C2143: синтаксическая ошибка: отсутствует ';' до '*'

ошибка C4430: отсутствует указатель типа - Int предполагается. Примечание: C ++ не поддержка default-int

Можно ли использовать Struct в классе? Если я объявляю структуру вне класса, шаблон не видит шаблон T.

Ответы [ 7 ]

3 голосов
/ 06 сентября 2010

$ 9,2 / 2. Ключ - цитата из C ++ Standard03

.

`Класс считается полностью определенным типом объекта (3.9) (или полным типом) при закрытии} спецификатора класса. В спецификации члена класса класс рассматривается как завершенный в теле функции, аргументах по умолчанию и конструкторе ctor-initializer (включая такие вещи во вложенных классах). В противном случае он считается неполным в своей спецификации члена класса.

Не знаю, что такое UINT16, но следующее должно работать

template<class T> 
class CClass 
{ 
private: 
    typedef struct { 
        T *mValue; 
        T *next; 
        T *previous; 
        short int index;                      // Replacing with int for illustration only
    } SValue; 
public:
    SValue* getNewSValue(void); 
private: 
}; 

РЕДАКТИРОВАТЬ 3: *** пришел туда, пытаясь сделать изменения жирным шрифтом (который я должен был удалить в любом случае)

template<class T> typename CClass<T>::SValue* CClass<T>::getNewSValue(void) 
{ 
    return new SValue; 
}

int main(){
    CClass<int> s;
    s.getNewSValue();
}
1 голос
/ 06 сентября 2010

Поскольку определение функции-члена находится в глобальной области видимости, необходимо указать тип возвращаемого значения с CClass:: для ссылки на имя в пределах области действия класса. Кроме того, ключевое слово typename необходимо при ссылке на имена типов, вложенные в шаблоны.

template<typename T>
typename CClass<T>::SValue* CClass<T>::getNewSValue(void)

Кроме того, вложенная структура не называется. Обратите внимание, что в C ++ классы и структуры имеют собственные имена, а имя typedef не является именем класса. Вам будет намного лучше избегать typedef.

struct SValue {
    T *mValue;
    T *next;
    T *previous;
    UInt16 index;
};
0 голосов
/ 06 сентября 2010

Для записи, ни один из них не скомпилируется (по крайней мере на GCC 4.2), как только будет вызван вызов getNewSValue(). Поскольку это открытый метод, который возвращает указатель на закрытый тип, вы получите сообщение об ошибке компиляции, в котором будет указано SValue is private.

Чтобы это сработало, вам нужно либо сделать общедоступным SValue, либо изменить тип возвращаемого значения getNewSValue() на что-то вроде void*, поскольку кажется, что вы пытаетесь сделать SValue непрозрачный тип.

0 голосов
/ 06 сентября 2010

SValue-Type находится внутри пространства имен CClass. Вы должны полностью определить typename вне класса.

template<typename T>
CClass<T>::SValue* CClass<T>::getNewSValue(void)

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

0 голосов
/ 06 сентября 2010

как насчет этого?это работало на VS2008

template<class T>
class CClass
{
private:
    typedef struct {
        T *mValue;
        T *next;
        T *previous;
        __int16 index;
    } SValue;

public:
    SValue* getNewSValue(void)
    {
        return new SValue;
    }
};
0 голосов
/ 06 сентября 2010

Объявите SValue до getNewSValue():

template<class T> 
class CClass 
{ 
private: 
    typedef struct { 
        T *mValue; 
        T *next; 
        T *previous; 
        UInt16 index; 
    } SValue; 
public: 
    SValue* getNewSValue(void); 
}; 

Также убедитесь, что UInt16 определено.

0 голосов
/ 06 сентября 2010

Похоже, ваш struct не определен, когда вы объявляете тип возвращаемого значения getNewSValue.

При этом у вас нет этой ошибки:

template<class T>
class CClass
{
public:
    SValue* getNewSValue(void);
private:
    typedef struct {
        T *mValue;
        T *next;
        T *previous;
        UInt16 index;
    } SValue;
};

template<typename T>
SValue* CClass<T>::getNewSValue(void)
{
  return new SValue;
}

Ивам также необходимо указать тип возвращаемого значения SValue, поскольку он вложен в CClass при его использовании для определения getNewSValue.

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