2012-12-12 20 views
-1

看看這個...... http://en.cppreference.com/w/cpp/container/vector/insert 編譯器如何區分第3個和第4個之間的區別,即在所提供的範圍內是否使所需int的no.of副本或填滿容器。編譯器如何區分以下內容?

// 3rd 
iterator insert(const_iterator pos, size_type count, const T& value); 

// 4th 
template< class InputIt > 
iterator insert(const_iterator pos, InputIt first, InputIt last); 

在此先感謝您。

+0

所以我們都在相同的波長上,我在你所說的超載中編輯過(任意使用C++ 11,無論使用C++ 11,答案都應該是相同的)。 –

+1

@BjörnPollex給定'std :: vector ','v.insert(it,2,0)'的重載決議將導致選擇模板函數(選項4),至少在C++ 03中是這樣。 (在C++ 11中,措辭是不同的,並且要求在任何時候類型不符合迭代器的要求時都要將模板函數從重載解析中排除。在C++ 03中,措辭要求模板形式具有與非模板形式相同的行爲,如果'InputIt'解析爲整數類型。) –

回答

0

iteratorconst_iterator根本不是同一類。那麼編譯器就沒有問題去推導出它使用的重載版本。

編輯:第二個和最後一個參數,在第4個版本必須是相同的,並且必須遵循InputIterator的概念。這是不是 size_t的情況下,沒有歧義。

+0

讓我們說這是要執行的代碼。只要看看它,你怎麼知道它是第一種情況還是第二種情況mylist.insert(it,2,20); – Saikiran

+0

你沒有引用第三和第四...好吧我要編輯我的文章 – phaazon

+0

首先,你的編輯只涉及C++ 11;在C++ 03中,標準(IIRC)是'InputIterator'類型是否是整型。而你並沒有真正解釋所問的問題:編譯器如何做出區分。 –

2

這是編譯器(或庫書寫器)的問題,而不是你的 。該標準說如果InputIt類型是可以調用表單3的 ,則行爲應該如同調用表單3一樣。通常,使用某種形式的模板元編程,使得采用迭代器的模板函數 將轉發到兩個不同的函數,通過基於InputIt是否可以將 隱式轉換爲size_type或不是(C + +03),還是 InputIt是一個合法的迭代器(C++ 11)。