libc ++ - конфликт имен для bind ()? - PullRequest
4 голосов
/ 24 января 2012

После удивительно небольшого взлома мне удалось установить libc ++ на моем Linux-компьютере (так как в libstdc ++ чего-то не хватает). К сожалению, часть моего существующего кода теперь сломалась из-за функций с тем же именем.

Обычно, и так, как мне нужно, bind () относится к сокетам. Однако в libc ++ была своя собственная функция bind (), которая в основном this , но без удобного пространства имен для их разделения. В соответствии с законом Мерфи, компилятор пытается использовать неправильную функцию и выдает ошибку. NetBeans не видит никаких проблем, потому что он на самом деле смотрит в файл sys / socket.h, как и должно быть хорошо.

Итак, поскольку обе функции в основном выходят за рамки моего контроля, как бы я сказал компилятору (clang ++), что он должен искать в определенном заголовке и больше нигде для этой функции?

Ответы [ 2 ]

8 голосов
/ 12 февраля 2013

У меня был конфликт между bind() из <WinSock2.h> и std::bind() (я использовал using namespace std;)
Я просто добавил :: перед вызовом метода, и это сработало! bind() => ::bind()

4 голосов
/ 24 января 2012

Во-первых, это не имеет ничего общего с Мерфи, я думаю: выбор шаблона bind(), вероятно, лучше всего подходит.Объявление std::bind() находится в пространстве имен std, однако, по крайней мере, в версии заголовочного файла, на которую я смотрю.Возможно ли, что ваш исходный файл содержит директиву using?(в этом случае вы заслуживаете всю боль, которую вы просили)

Если директива using отсутствует, версия без шаблона должна лучше подходить, если аргументы совпадают с точно .Если это по-прежнему не помогает, вы можете создать функцию пересылки для функции bind() из <sys/socket.h>, скажем, avoid_conflict_bind(), которая является единственной функцией, определенной в единице перевода, то есть она будет включать только <sys/socket.h> ине <functional>.Таким образом, нет возможности выбора функции bind(), которую перенаправляет эта функция, и затем вы можете использовать avoid_conflict_bind().

...