從實用的角度來看,我明白無論typedef
和test
有點「多餘」的需要,如果我們希望下面的代碼編譯被刪除:爲什麼typedef模板非法?
template< typename type_t >
typedef struct tagTest
{
int a;
} test;
但是,我認爲,這組typedef聲明是聲明集的一個子集。他們碰巧有那個特定的decl-specifier。那是我爲
typedef struct tagTest
{
int a;
} test;
引入標識符test
和聲明結構tagTest
合理化。如果這種解釋是正確的,那麼標準中的以下段落應該允許template
typedef
(儘管不具有關鍵字using
給出的含義)。
在模板聲明的聲明應 - (1.1) 聲明或定義一個函數,類,或者一個變量,或 - (1.2) 定義成員函數,一個構件類中,構件枚舉,或一個類 模板的或嵌套類模板內的類的靜態數據成員,或者 - (1.3) 定義一個類或類模板的成員模板,或 - (1.4 ) 是別名聲明。
我在我的推理中看不到錯誤,但結論是非法的。
解決上述難題的標準有哪些相關部分?上述推理
UPDATE 部分使用了typedef
struct
聲明結構的事實。據我所知,說明符是指任何聲明的變量都是真正的類型。也就是說,typedef
將test
從單純的變量升級到與聲明的tagTest
等效的類型。這就是爲什麼下面的代碼編譯(雖然有警告)。
typedef struct tagTest
{
int a;
};
tagTest t;
其中一個答案照顧多餘的test
。但是,它是可以使用的typedef沒有聲明符
呃......這些情況都沒有涵蓋它。聲明恰好包含聲明一個類的東西並不意味着該聲明本身聲明瞭一個類。該聲明僅僅定義了一種類型。 – hvd
@hvd在C中,包含標記結構的typedef確實會聲明該結構,並定義一個名稱來替代它。你是說C++在這方面有所不同嗎? – davmac
@davmac不,我們同意這種聲明的最終效果。我要說的是,聲明結構的部分不是聲明本身,只是聲明的一個子部分。這適用於C和C++。 – hvd