2013-08-13 27 views
7

NULL bir çift bir işaretçi başlatamadığında hat. aşağıdaki gibiC++ I 4.4.7 g ++ ile derleme (ve herhangi bir daha yüksek anda gidemez) ve üçüncü sözdizimini izin vermelidir <code>-std=gnu++0x</code> derleyici anahtarı kullanılarak

typedef std::vector<CI_RecordInfo_Pair> CI_RecordInfo_Vector; 
typedef std::vector<std::pair<std::string, CI_RecordInfo_Vector*> > MgrBlks; 
MgrBlks mgr_n_blks { {"T2M_NAME", NULL} }; // <--- line 59 

Ancak derleyici yakınır:

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h: In constructor 'std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[9], _U2 = long int, _T1 = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = CI_RecordInfo_Vector*]': 
tom.cpp:59: instantiated from here 
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h:90: error: invalid conversion from 'long int' to 'CI_RecordInfo_Vector*' 

ben "uzun int" BOŞ olduğunu ve nedense ben bir işaretçi dönüştürmek yapamıyorum varsayalım. Yine başka bir yerde Yapılar haritasında içinde, ben

foo["X"] = { NULL, "bar", 12 }; // first element is a pointer 

fark nedir gibi bir şey derlemek başardı?

+4

'yerine' NULL' işin nullptr' kullanarak mu? –

+0

g ++ 4.4 tarafından desteklenmiyor. 4.6'ya kadar değil. – Chap

cevap

14

derleyici bu hat reddetme doğrudur:

MgrBlks mgr_n_blks { {"T2M_NAME", NULL} }; 

C++ 11 std::pair herhangi bir bağımsız değişken türleri alan bir şablon kurucu, sonra da üyelerine dönüştürür var

template<typename X, typename Y> 
    pair(X&& x, Y&& y) 
    : first(std::forward<X>(x)), second(std::forward<Y>(y)) 
    { } 

şablon argümanı kesinti const char* olarak şantiye şablon argümanları deduces ve (GCC) ileböylece NULL, 0 veya 0L veya benzer bir şekilde tanımlanması gerekir 10 İlk argüman türü std::string dönüştürülebilen ama longCI_RecordInfo_Vector* dönüştürülebilir değil, bu yüzden yapıcı olarak adlandırılan edilemez.

Bir yapı eşlemi olan diğer durum için, argüman indirgemesi yoktur, atamanın RHS'si yapı türüne dönüştürülebilir olmalıdır ve bu durumda, ilk başta değil, yapının ilk üyesini doğrudan başlatmak için NULL kullanılır. long olarak çıkarılan ve bir işaretçiye dönüştürülemeyen bir long başlatılıyor.

C++ 11'de NULL'u kullanmayın, nullptr tam olarak bu sorunlardan kaçınmak için icat edildi, onu kullanmalısınız.

MgrBlks mgr_n_blks { {"T2M_NAME", (CI_RecordInfo_Vector*)NULL} }; 

ama sadece nullptr kullanımı daha basit ve çok daha net:

Geçici bir sağ türüne argüman Döküm olacaktır.

+0

+1 nullptr yerine NULL yerine yeni C++ belirtmek için –

+0

'NULL'' 0' olarak tanımlanırsa, 'int' türünde değil,' long' yazılır. Görünüşe göre, uygulama 'NULL '' 0L' ya da benzer bir şeyi tanımlar. G ++ 4.7.2 ile 'NULL',' long' türünde '__null' olarak genişler. –

+0

nullptr, g ++ 4.6'ya kadar eklenmedi, ancak NULL'ın döküm işlemi doğru şekilde derlendi. – Chap

İlgili konular