2010-08-17 19 views
5

Şu anda Visual Studio 2008'den 2010'a geçiş yapıyorum. Yazılımım, Boost ve TR1 özelliklerini yoğun olarak kullanıyor. Şimdi bir çok derleyici hatası alıyorum çünkü VC10'un kendi TR1 uygulaması var.TR1 - Hangisi daha iyi?

Microsoft'un TR1 uygulamasını _HAS_CPP0X anahtarıyla devre dışı bırakabileceğimi biliyorum (bkz. here), ancak bu durumun gelecekte ilgi çekici olabilecek diğer özellikleri de devre dışı bırakıp bırakmadığından emin değilim.

Peki, TR1'in daha iyi uygulanmasının hangisi olduğunu merak ediyorum: Boost veya Microsoft'un hangisi? Hiç bir farklılık var mı? Microsoft uygulamasını devre dışı bırakmanın herhangi bir dezavantajı var mı?

+0

Aradığınız yanıt bu değil ... Microsoft tr1'i devre dışı bırakırsanız, yükseltmeden derleyemezsiniz. Güçlendirme kullanıyorsanız, sabit bir yükseltme yoluna sahip olduğunuzdan ve kodunuzun MSVC dışında derleneceğinden emin olabilirsiniz. Bu ve destek, TR1'de olanlardan çok daha fazla özellik taşıyor :) –

+0

Tam hata nedir, yinelenen tanımlar mı? – MSalters

+0

Evet, kesin hata yinelenen tanımlardır. Ayrıca ADL ile bir ilgisi var.Eğer bind ya da _1 (std :: bind ve std :: tr1 :: placeholders :: _ 1) her geçitini kabul edersem, kod çok kötü olur :) –

cevap

1

Kodunuz VC10'un standart kitaplığı ile derlenmiyorsa, bu standart olarak uygun olmadığını gösterebilir. VC10'daki standart kütüphane Dinkumware'den geliyor ve standart bir kütüphane uygulaması söz konusu olduğunda bu adamlar kötü değil. (PJP, lib çalışma grubunun başkanıydı.) Gelecekte uyumlu olamayacağınız için, VC'ye özel bir sorun olarak görmeden önce her konuya çok yakından bakarım.

Ayrıca TTBOMK, VC10 sadece TR1 ile gelen, ancak C++ 1x ile değil (örneğin std::shared_ptr yerine std::tr1::shared_ptr arasında; ICBWT), bu yüzden artırmak en ve VC10 en kütüphaneleri aslında tam olarak karşılaştırılabilir değildir.

+0

Liste uygulamalarını kontrol ettiniz mi? Ben vs2010 ile geldi bakmadım, ama önce tüm splicing için doğrusal bir suç ortaklığı vardı. – leiz

+1

@leiz: Hayır, yapmadım. (Ben nadiren hiç bir zaman bir liste kullanarak bitti, ben başladığımda bile. Genellikle, vektör daha iyi olduğu ortaya çıkıyor.) Ama diyorum ki, kod bunu kullanarak bile _compile_ bile yokken, görevden önce çok yakın görünecektim. Bu, kütüphanenin uygulanmasıyla ilgili bir problem olarak, kodla ilgili bir sorun değil, çünkü _generally_, bunların uygulanması oldukça iyi. Bununla birlikte, Dinkumware'in uygulamasında _no problemlerinin olduğunu düşünüyorum. Dinkumware insanlar tarafından çalıştırılır. – sbi

+0

@leiz: C++ 0x şimdi "ekleme" nin O (1) olması gerektiğini ve "boyut" un liste için O (n) olmasını yetkilendirdiğini (ikisi de uyumsuz olduğundan), bunun olup olmadığını bilmiyorum C++ 03 için durum oldu. –

0

İlk:
Boost ve TR1'i yan yana kullanabilmeniz gerekir. Her şey doğru şekilde yapılandırılmışsa ve using namespace ile uğraşmıyorsanız, hata almayacaksınız.

C++ 11 deklarasyon (more info) sağlayamaz yükseltilmesi sırasında auto anahtar kelime (more info) ya da sınıfın başlatma özellikleri gibi özellikleri içerir.

Diğer tarafta Boost, yalnızca C++ 11 özelliklerinin uygulanmasından çok daha fazlasını sunar. Esasen Boost, C++ standardına eklendiği düşünülen kütüphaneler koleksiyonudur.

her ikisinin de sağlanması özellikleri (shared_ptr gibi) ben Boost öneriyoruz gelince:

  • Boost Sen net bir bağımlılığı
  • belli C++ 11 özellikleri desteklemez hangi derleyici ile derler C++ 11 üzerinde geçiş yapmak yerine (çoğu derleyicinin farklı uyguladığı)
  • Yükseltme veri türleri (ör. shared_ptr), serialization gibi diğer Yükseltme özellikleriyle uyumludur.

Benim önerim kesinlikle ihtiyaç sadece eğer C++ 11 kullanmak ve tüm diğer durumlarda Boost etmektir.

İlgili konular