簡體   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