I am using the new libcxx library and I have a code that calls the socket function bind(). The problem is that when I type using namespace std; the compiler gives me an error for the following code:
int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));
The error using clang (svn build):
error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int'
int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));
I think that the problem is that using namespace std; brings the function std::bind() from the header <functional> to the scope (although the header is not included). As I am using a third party library that uses the entire namespace std I can’t easily change the class names to fully qualified names.
I was wondering whether this is a problem in the implementation of the library or whether there are some new rules in C++11 that might potentially break an old code that uses bind(). Any thoughts on this would be appreciated.
Thanks
Roman
This isn’t a problem in the implementation of the libraries. C++11 introduced its own
std::bindfunction intonamespace std, which is used to bind parameters to functions and support a bit of higher-order programming.The reason for having
namespace stdis to help prevent new library functions and classes from causing breaking changes in existing code. The reason for this is that everything has a name starting withstd::, which prevents name collisions.However, if you write
using namespace std;in your program, you’re exposing yourself to potential breaking changes like this one, since the free functionbindand the functionstd::bindcan’t necessarily be disambiguated.To fix this, you can call
bindas::bindto make clear that it’s in the global namespace, or you can remove theusing namespace std;at the top of the program.Hope this helps!