繁体   English   中英

如何使用带有类的模板

[英]How to have a Struct with template with a class

使用此代码(只是一类测试):

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

$ 9.2 / 2-关键是C ++ Standard03的以下引用

`在类说明符的结束时,类被认为是完全定义的对象类型(3.9)(或完整类型)。 在类成员规范中,该类在函数体,默认参数和构造函数ctor-initializers(包括嵌套类中的这类事物)中被视为完整。 否则,它在其自己的类成员规范中被视为不完整。

不知道什么是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: ***来到那里试图改变BOLD(我应该删除它)

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

int main(){
    CClass<int> s;
    s.getNewSValue();
}

由于成员函数定义在全局范围内,因此需要使用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;
};

当您声明getNewSValue的返回类型时,看起来您的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

getNewSValue()之前声明SValue

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

另外,确保定义了UInt16

试试这个怎么样? 它适用于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;
    }
};

SValue-Type位于CClass-namespace中。 您需要完全限定类外的类型名称。

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

此外,如果公共方法返回SValue,则应将其公之于众。

对于记录,一旦调用getNewSValue()调用,这些都不会编译(至少在GCC 4.2上)。 由于它是一个返回指向私有类型的指针的公共方法,因此您将收到一个编译错误,指出SValue is private

为了实现这一点,你需要公开SValue,或者将getNewSValue()的返回值类型更改为void* ,因为看起来你正试图让SValue成为一个不透明的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM