В моей программе я хочу, чтобы определить новый тип данных для IPAddressV4 для этой цели я определила следующий класс:Определение нового типа данных, который ведет себя как стандартный C++ типа данных
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include "archive.hpp"
using boost::asio::ip::address_v4;
typedef boost::uint8_t uint8; /**< 8-bit unsigned interger. */
class IPAddrV4
{
public:
/**
* Construct a IPAddrV4 data type.
*/
IPAddrV4() : _ip_address(0)
{}
/**
* Construct a IPAddrV4 data type.
*
* @param ip_address The value of the IPv4 Address in text format.
*/
IPAddrV4(std::string ip_address) : _ip_address(0)
{
*this = ip_address;
}
/**
* Set the IPv4 Address value.
*
* @param val The value of the IPv4 Address in text format.
* @return The reference to the IPAddrV4 data type.
*/
IPAddrV4& operator=(std::string ip_address)
{
boost::asio::ip::address_v4::bytes_type bytes
= boost::asio::ip::address_v4::from_string(ip_address).to_bytes();
_ip_address = ((uint32(bytes.at(0)) << 24) |
(uint32(bytes.at(1)) << 16) |
(uint32(bytes.at(2)) << 8) |
uint32(bytes.at(3)));
return *this;
}
IPAddrV4& operator=(uint32 ip_address)
{
_ip_address = ip_address;
return *this;
}
/**
* Get the IPv4 Address data type value.
*
* @return The IPv4 Address data type value in binary form.
*/
operator uint32()
{
return _ip_address;
}
private:
uint32 _ip_address;
};
Позже я Я использую этот класс для выполнения сериализации и десериализации для передачи данных по TCP-соединению. Когда я делаю сериализацию с выходным архивом, у меня нет никаких проблем.
IPAddrV4 ip("127.0.0.1");
oarchive & ip;
В приведенном выше примере значение IP преобразуется в двоичную форму и затем копируется в выходной архив. И архетист увеличит свой размер на 4 байта.
Но когда я пытаюсь использовать этот тип данных с архивом ввода для сериализации я проблема:
IPAddrV4 ip;
iarchive & ip;
Это ошибка, которую я получаю во время компиляции:
No match for 'operator&' in 'input_Archive & IPAddrV4::operator uint32()'
Так что я отсутствую в IPAddrV4?
Примечание: Входной архив отлично работает со стандартными типами данных C++, такими как uint, string..etc.
Одно замечание: вы пишете конструктор с точки зрения задания. Не делай этого, это ужасно неэффективно. Напишите свое назначение в терминах конструктора, за которым следует своп. –
Я не уверен, что правильно вас понял, можете ли вы объяснить, почему он говорит, почему он неэффективен? – IoT
Конструктор полностью инициализирует все элементы до первого «{». Ваш конструктор делает это, а затем вызывает * this = ip_address, который вызывает вызов оператора присваивания. По сути, он дважды присваивает значения переменным-членам. –