何時在類型前加typename

首先,針對typename這個修飾符我不再贅述它的作用是什麼,我只是表達出何時加上typename這個事情。

我們知道,當我們定義了一個類,並在其中加入了一些類型,例如“typedef T* iterator”,此時如果我們在一個template function中使用了其中的iterator,那麼我們需要這樣使用:

template<typename T>
void f()
{
    tyname T::iterator iter;
}

因爲在編譯器看來,它不知道這個是類型T中的變量還是類型,所以要加上typename,但是在我接下來的代碼中:

template<class T, class Alloc>
tyname vector<T, Alloc>::iterator vector<T, Alloc>::allocate_and_fill(size_type n, const value_type& val)
{
    iterator result = data_allocator::allocate(n);
    uninitialized_fill_n(result, n, val);
    result = result - n;
    return result;
}

我同樣在class vector中定義了size_type和value_type,那麼爲什麼這兩個就不需要加上?

我們在定義allocate_and_fill函數的時候,在前面加了命名空間作用域 vector<T, Alloc>,那麼在allocate_and_fill的函數中,參數的相關類型一定是以vector中定義的爲主,這個是C++擁有的“作用域內名字覆蓋”的特性。但是他的返回值iterator在定義的時候並沒有放在vector<T, Alloc>::的作用域中,所以鏈接器會去找在smart_stl命名空間中的iterator,於是就在其他的.cpp文件中找到了這個類型,但他並不是在vector類中定義的那個iterator,所以要加上作用域vector<T, Alloc>

但是iterator作用類型,是vector<T, Alloc>中的“嵌套從屬類型名稱”,所以要在前面加上typename。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章