2012-03-30 19 views
8

Sadece C++ 'nın pair<double, int>'dan pair<int, int>'a döküm için herhangi bir uyarı vermediğini buldum, bu biraz şaşırtıcı. Ben g++ test_type.cpp -Wall -Wconversion kullanarak, ama yine de hiçbir uyarı oluşturulur derlemekg ++ Döküm çifti için uyarı seçenekleri var mı?

#include <vector> 
#include <utility> 
using namespace std; 


int main() 
{ 
    std::vector<pair<int, int> > v; 
    pair<double, int> p = make_pair(3.8, 3); 
    v.push_back(p);               
} 

: İşte benim programı test_pair.cpp olduğunu. G ++ v4.6.1 kullanıyorum. G ++ 'nun bunun için nasıl bir uyarı oluşturduğuna dair herhangi bir fikri olan var mı?

+1

bu notasyonu nedir pair şuna benzer yapıcı şablonları? Ben aşina değilim: 'v.push_back ({p});'. – orlp

+0

Üzgünüm, C++ 11 özelliklerini kullanmaya çalışıyordum, köşeli ayraçları kaldırmalıyım. – chtlp

cevap

4

Çiftler (ve kopyalar), hemen hemen her şeyden yapılabilir. Özellikle, her bir eleman, dolaylı olarak kendisine dönüştürülebilen herhangi bir şeyden inşa edilebilir. Temel olarak, "beklediğiniz şeyi yapar".

template <typename U, typename V> 
pair(U && u, V && v) : first(std::forward<U>(u)), second(std::forward<V>(v)) 
{ } 

Ancak, demek sadece olmalıdır::

v.emplace_back(3.8, 3); 
+2

+1, ancak bir nitpick var, onlar sadece üstü açık değil, sadece üstü açık bir şekilde dönüştürülebilir. Bu uzun bir süre için standart ifadeler olmuştur (C++ 03, C++ 98 hakkında emin değilim), ancak C++ 03 ile kısıtlama uygulanamadı bile. –

+1

v.emplace_back (3.8, 3) hala herhangi bir uyarı üretmiyor. Ama açıklama için teşekkürler. Ben bu örtük döküm özelliği biraz kafa karıştırıcı olabilir. – chtlp

+1

Söz konusu örnek için ilgili contructor aslında 'template çifti (const çifti & p); ' – leftaroundabout