2013-03-06 30 views
5

Çok büyük bir proje üzerinde çalışıyorum ve tek bir dosyada hepimiz bir derleme zamanı hatası aldık, derleyici winsock.h çağrımızın geldiğini düşünüyor. bind() aslında std::bind() için bir çağrıdır. İçerdeki bir dosyada using namespace std kod snippet'i var gibi görünüyor. Bu using namespace std'un kullanımda olduğu yerleri bulup kaldırabiliriz, ancak belki de bunu yapmanın daha iyi bir yolu var mı?std :: bind ve winsock.h bind confusion

+0

ad alanları eğlenceli değil mi? –

+4

Hayır, sadece onu kaldırın. – inf

+2

'namespace std' kullanarak kaldır, aksi takdirde başka bir adla gelecekte de aynı soruna sahip olacaksın. Nedenini açıklamak için – juanchopanza

cevap

15

Genel ad alanını belirtmek için çağrılarınızı ::bind() kullanın.

7

Evet, bu talihsiz bir durumdur. Ben http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.html de açıklandığı gibi tam olarak doğru argüman türlerini kullanmak sürece std::bind şablonu daha iyi bir eşleşme geçerli:

sorun soket Bind() işlevi bu imzayı olmasıdır: bu yüzden
int bind(int, const sockaddr*, socklen_t);
çağrı const olmayan bir işaretçi kullanarak örnek, variadic şablon std :: bind öğesinin daha iyi eşleştiğini bulur. Üçüncü argüman socklen_t dışında herhangi bir ayrılmaz tür ise, aynı olur.

İlk argüman "soket benzeri" Ben is_integral kullanılarak tanımlanır ise set aşırı yüklenmeden std::bind kaldırarak, bu belirsizliği önlemek için GCC en std::bind bir uyan uzantı ekledi çünkü kod GCC ile çalışacak

ve is_enum. Bu, diğer uygulamalarda da yardımcı olmaz. using namespace std; Çıkarma

zaten iyi bir fikir olduğunu, ancak olur bind() bir niteliksiz çağrı hala argüman bağımlı arama ile std::bind bulabildiğim ad std (örneğin std::size_t gibi) tanımlanan bir türü kullanmak, çünkü tamamen yeterli olmayabilir. Jonathan Potter'ın cevabı, doğru işlevi almanızı sağlamak için en iyi yoldur: ::bind olarak nitelendirin.

+0

+ 1. –