Ç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
cevap
Genel ad alanını belirtmek için çağrılarınızı ::bind()
kullanın.
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:
İlk argüman "soket benzeri" Bensorun 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.
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.
+ 1. –
ad alanları eğlenceli değil mi? –
Hayır, sadece onu kaldırın. – inf
'namespace std' kullanarak kaldır, aksi takdirde başka bir adla gelecekte de aynı soruna sahip olacaksın. Nedenini açıklamak için – juanchopanza