[英]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.