2012-05-06 24 views
6
Aşağıdaki kod gcc-4.5.1 ile derler

ancak Visual Studio 11.Visual Studio 11 derleme zamanı hatası kullanarak std :: map

#include <map> 
#include <array> 

typedef std::pair<const unsigned int, std::array<const unsigned int, 4>> pairus; 

int main(){ 

    std::map<const unsigned int, std::array<const unsigned int, 4> > x; 
    std::array<const unsigned int, 4> troll = {1, 2, 3, 4}; 
    x.insert(pairus(1, troll)); 

    auto z = x[1]; 
} 

1 şimdi std::array<> troll eşleştirilir. Ekleme iyi çalışıyor ve program derleniyor.

error C2512: 'std::array<_Ty,_Size>::array': hiçbir uygun varsayılan yapıcı

nedenleri nelerdir> Dolayısıyla bu 1 eşleştirilmiş trol diziyi almaya çalışırken, aşağıdaki hata ile derleme değil programı - Ama, en kısa sürede i auto z = x[1] deneyin gcc ve vs11 arasındaki davranış farkı ve nasıl düzeltileceği?

Teşekkürler.

+0

'pair_' make_pair' olmamalıdır? (Bunun senin problemin olduğunu düşünmüyorum) – Corbin

+0

Evet, std :: pair <> tipinde olmakla iyi çalışıyor. Bu garip derleyici davranışı beni çok zorlayan – ScarletAmaranth

+0

Eşlik nasıl görünür (özel bir işlev mi olduğu varsayılıyor mu? Veya MSVC++'nin make_pair'in takma adı mı?). Sorunun, çift kodda yattığından şüpheleniyorum çünkü gönderdiğiniz kodun herhangi bir yerinde varsayılan kurucuya gerek yoktur. (Eğer x [k] yaparsanız, varsayılan bir ctor gerekli olsa da, k haritada bulunmaz.) – Corbin

cevap

4

auto z = *x.find(1); deneyin. [] -operator, varsayılan yapıya sahip bir tür gerektirir. Aslında, tüm kapsayıcı varsayılan yapıya sahip bir tür gerektirir, bu yüzden çeşitli uygulamaları denediğinizde rastgele bir şans bekleyemezsiniz.

+0

Sen bir dahisin! :) Eserleri! :) Gcc'nin biraz arcane büyü bildiği anlaşılıyor. Teşekkürler;) – ScarletAmaranth

+0

Varsayılan yapıcı gereksiniminin C++ 11'in artık tüm kapsayıcı için geçerli olduğundan emin değil. Yeni haritanın hareketli tiplerini tutabilmesi gerekiyor, ancak bunlar için sadece bazı işlevler mevcut. [] Operatörü ben düşünmüyorum. –

3

Türünüz, sabit içerdiği için atanamaz.

x [1] atanabilir bir başvuru döndürmeye çalışır. Henüz orada değilse, anahtar için boş bir değer de oluşturacaktır. Bunların ikisi de sizin türünüzle geçersizdir. Bunun yerine bulmayı kullanmanız gerekecek.

+0

Neden dünyadaki gcc şeyleri derlerdi? – ScarletAmaranth

+0

Standart sadece neyin gerekli olduğunu belirtir, neye izin verildiğini belirtmez. Gcc uygulamasının çalıştığı bazı durumlar özel durumunuzda aynı soruna neden olmaz. Bunu yapmakta özgürdür. Burada teşhis gereksinimi yok. –