2016-06-04 20 views
5

GCC 4 vs ile ifstream üzerinde Karşılaştırma "daha az": Bu derler ve GCC 4.9.3 ile ancak GCC 6.1.1 bu hata üzerinde iyi çalışırSadece bu kod parçasının üzerinde tökezledi 6

std::string export_str = "/path/to/file"; 
std::ofstream export(export_str.c_str()); 
if (export < 0) { 
    std::cout << "Unable to export" << std::endl; 
    return -1; 
} 

olarak gelir:
-std=c++98 (derleme etmez)
-std=c++03 (derleme etmez)
: birlikte GCC 6 denedik

error: no match for ‘operator<’ (operand types are ‘std::ofstream {aka std::basic_ofstream<char>}’ and ‘int’) 
if (export < 0) { 
    ~~~~~~~~~~~^~~ 

Düzenleme (değil derleme etmez): Ancak GCC 4'te hala -std=c++11 ile derler. Bu spesifik gerçek, aşağıdaki cevapta da açıklanmıştır. Bu nedenle, standartta bir değişiklik olduğunu tahmin ediyorum.

Biraz araştırma sonra kod değiştirdi: Bu derler ve iyi çalışır ama muhtemelen iyi bir arama terimi kombinasyonu ile geliyor değil, bu değişim için iyi bir açıklama bulamadık

std::string export_str = "/path/to/file"; 
std::ofstream export(export_str.c_str()); 
if (export.fail()) { // <-- related change 
    std::cout << "Unable to export" << std::endl; 
    return -1; 
} 

.

Bu yüzden sorum, değil "ofstream'in geçerliliğini nasıl denetlerim" . Zaten biraz daha fazla veya daha az tatmin edici cevaplar var ("daha fazla veya daha az" çünkü sorun biraz karmaşık görünüyor).
Here veya here veya here.

Sorum yukarıdaki kodda (export < 0) gibi şeyler derleme konusunda GCC 4 ve GCC 6 arasında yapılan değişiklik için bir açıklama olduğunu.

Herhangi bir işaretçi için teşekkür ederiz.

+0

'ihracat <0' demek? – juanchopanza

+0

aptal kişi 'yazdıysam (ihracat <0)' yerine C-imsi '(ihracat)' yapı eğer - sadece, aynı zamanda daha uzun Karartılmış değil; onlar bunu neden, muhtemelen – vaxquis

+3

ben stronly ihracat adında bir değişken oluşturmak için değil teşvik etsin ... asla bilemeyeceğim. C++ 11'de kullanılmaz, ancak hala saklıdır. –

cevap

12

Ön C++ 11, standart akımı NULL kötü akışı olan ve olmayan NULL iyi akış gösteren ile void* örtük dönüştürülebilir.

Peki olsun bir işaretçi yasal ("derlemek gerektiği" anlamda) hem (void*)export ve (void*)0 arasındaki karşılaştırma, ve non-sensical olduğunu. C++ 11

, void* stream dönüşüm, önceden olduğu gibi akımın durumunu kontrol sağlar bool, açık bir dönüşüm ile ikame, ancak bu sizin yasadışı olarak saçma kodu yapar edildi. Burada önemli olan, örtük dönüştürme işleminden btw'ye geçiş şeklindedir. bool'a yapılan yeni dönüşüm örtülüyse, kod hala derlenecek ve (bool) export < 0 karşılaştırması yapacaktır. Ancak açık dönüşümle, bu bir oyuncu gerektirir. gcc4 ve gcc6 arasındaki fark ile ilgili


: libstdC++ 4.x akımlar bu konuda uygun C++ 11 vardır.C++ 11 akış dönüşümü, akışlar ve SSO için anlam taşıma hareketleri de dahil olmak üzere, birkaç C++ 11 eksikliğiyle, 5. sürümde düzeltildi/uygulandı.

gcc4 yalnızca C++ 11 özelliği tamamlanmadı. Bu durumda, olmaması gereken eski kuralları izler.


sadece şeyiyle hatırına: Daha önce yorum olarak bahsedilen, export bir anahtar kelime ve bir isim olarak kullanılmamalıdır. Beklediğiniz Neler

+0

Teşekkürler, bu bana açıklıyor. C++ 11 özelliği ile GCC 4'ün tam olmayanlığı ile ilgili olarak, bunu gerçekten g + - 4.9 -std = C++ 11 'ile ekleyebilirim. Sorduğumda bunu belirtmeyi unuttum. – Bugfinger

İlgili konular