0

Having the following code:

SockAddrIn.h

#pragma once #include <winsock2.h> #include <string> namespace networking { class SockAddrIn { public: SockAddrIn() {} SockAddrIn(const std::string& ip, uint16_t port); SockAddrIn(uint16_t sin_family, unsigned long s_addr, uint16_t port); SockAddrIn(struct sockaddr_in sin) : m_sin(sin) {} virtual ~SockAddrIn() {} operator struct sockaddr_in(); operator struct sockaddr_in*(); operator struct sockaddr*(); private: struct sockaddr_in m_sin; }; } 

SockAddrIn.cpp

#include "networking/SockAddrIn.h" #include <winsock2.h> using namespace networking; SockAddrIn::SockAddrIn( const std::string& ip, uint16_t port) : SockAddrIn(AF_INET, inet_addr(ip.c_str()), htons(port)) {} SockAddrIn::SockAddrIn( uint16_t sin_family, unsigned long s_addr, uint16_t port) { m_sin.sin_family = sin_family; m_sin.sin_addr.s_addr = s_addr; m_sin.sin_port = port; } SockAddrIn::operator struct sockaddr_in() { return ( m_sin ); } SockAddrIn::operator struct sockaddr_in*() { return ( &m_sin ); } SockAddrIn::operator struct sockaddr*() { return ( (struct sockaddr*)&m_sin ); } 

The following error is generated (Line 15 is the 3rd constructor):

include\networking\SockAddrIn.h|15|error: expected ',' or '...' before '.' token| src\networking\SockAddrIn.cpp||In constructor 'networking::SockAddrIn::SockAddrIn(const string&, uint16_t)':| hi_client\src\networking\SockAddrIn.cpp|11|error: no matching function for call to 'networking::SockAddrIn::SockAddrIn(int, long unsigned int, u_short)'| hi_client\src\networking\SockAddrIn.cpp|11|note: candidates are:| include\networking\SockAddrIn.h|16|note: networking::SockAddrIn::SockAddrIn(sockaddr_in)| include\networking\SockAddrIn.h|16|note: candidate expects 1 argument, 3 provided| include\networking\SockAddrIn.h|15|note: networking::SockAddrIn::SockAddrIn(uint16_t, long unsigned int)| include\networking\SockAddrIn.h|15|note: candidate expects 2 arguments, 3 provided| include\networking\SockAddrIn.h|14|note: networking::SockAddrIn::SockAddrIn(const string&, uint16_t)| include\networking\SockAddrIn.h|14|note: candidate expects 2 arguments, 3 provided| include\networking\SockAddrIn.h|13|note: networking::SockAddrIn::SockAddrIn()| include\networking\SockAddrIn.h|13|note: candidate expects 0 arguments, 3 provided| include\networking\SockAddrIn.h|10|note: constexpr networking::SockAddrIn::SockAddrIn(const networking::SockAddrIn&)| include\networking\SockAddrIn.h|10|note: candidate expects 1 argument, 3 provided| src\networking\SockAddrIn.cpp|16|error: expected ',' or '...' before '.' token| src\networking\SockAddrIn.cpp||In constructor 'networking::SockAddrIn::SockAddrIn(uint16_t, long unsigned int)':| src\networking\SockAddrIn.cpp|20|error: request for member 'S_addr' in 'S_un', which is of non-class type 'long unsigned int'| src\networking\SockAddrIn.cpp|21|error: 'port' was not declared in this scope| ||=== Build failed: 5 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 

It looks like something about the 'unsigned long' part irritates the compiler.. Couldn't find anything on the web. This looks really weird to me.. What am I missing?

4
  • Add #include <cstdint> at the top of the file. You need it for uint16_t . Commented Feb 17, 2017 at 22:07
  • @RSahu Doesn't seem like it helps .. I have many, many classes with the uintx_t kind of typing and no cstdint included in them, no errors generated. Commented Feb 17, 2017 at 22:09
  • Nevertheless, give it a shot. It can't hurt. Commented Feb 17, 2017 at 22:10
  • @RSahu I did, it doesn't change anything Commented Feb 17, 2017 at 22:11

1 Answer 1

2

s_addr is defined as a macro in winsock2.h (or a header inaddr.h included by winsock2.h, to be precise). Like this:

#define s_addr S_un.S_addr /* can be used for most tcp & ip code */ 

This turns your constructor declaration into nonsense:

SockAddrIn(uint16_t sin_family, unsigned long s_addr, uint16_t port); // becomes SockAddrIn(uint16_t sin_family, unsigned long S_un.S_addr, uint16_t port); 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.