我目前正在用 C 實作容器,我對用于宣告成員函式的語法有疑問。
我有一個Vector_declaration.hpp檔案,我在其中宣告了向量類及其所有組件,例如:reference operator[](size_type n);
Wherereference是由typedef typename Allocator::reference reference;
在另一個名為vector.hpp 的檔案中,我想實作Vector_declaration.hpp 中定義的元素,我發現唯一的方法是使用以下語法:
template <typename T, typename Allocator>
typename vector<T, Allocator>::reference
vector<T, Allocator>::operator[](size_type n)
我不明白typename vector<T, Allocator>::reference這里扮演什么角色,為什么我typename每次在函式中使用它時都必須重寫它,難道我不能只用這個詞reference來代替嗎?反正有沒有這樣做,所以代碼會更干凈?
uj5u.com熱心網友回復:
這里:
template <typename T, typename Allocator>
typename vector<T, Allocator>::reference
vector<T, Allocator>::operator[](size_type n);
的typename vector<T, Allocator>::reference是該方法的回傳型別。考慮一下沒有模板的情況:
struct foo {
using reference = int&;
reference bar();
};
foo::reference foo::bar() { /*...*/ }
reference在 的范圍內宣告foo。如果要在范圍之外參考它,則foo需要限定名稱foo::reference。因為這:
reference foo::bar() { /*...*/ }
將導致錯誤:“未宣告參考”。
此外,typename需要是因為vector<T, Allocator>::reference是一個依賴名稱(即您需要告訴編譯器它是一種型別,在專業化中它可能是成員的名稱或根本不存在)。
uj5u.com熱心網友回復:
使用尾隨回傳型別 (C 11),您可以執行以下操作:
template <typename T, typename Allocator>
auto vector<T, Allocator>::operator[](size_type n)
-> reference
{
// ...
}
之前vector<T, Allocator>::,你還沒有在作用域類中,所以寫作只是reference參考全域作用域中的那個(::reference)。
因此,您可以在引數和尾隨回傳型別(以及函式范圍內)中使用類中的型別/使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326449.html
上一篇:引數包排序(或等效行為)
