In my program I want to define a new data-type for IPAddressV4 for this purpose I defined the following class:
在我的程序中,我想为IPAddressV4定义一个新的数据类型,为此我定义了以下类:
#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;
};
Later I am using this class to do some serialization and deserialization to send data over a TCP connection. When I am doing serialization with an output archive, I don't have any problem.
稍后我将使用这个类来执行一些序列化和反序列化以通过TCP连接发送数据。当我使用输出存档进行序列化时,我没有任何问题。
IPAddrV4 ip("127.0.0.1");
oarchive & ip;
In the above example, the value of the IP is converted into binary form and then copied to the output archive. And the oarchive will increase its size by 4 Bytes.
在上面的示例中,IP的值转换为二进制形式,然后复制到输出存档。oarchive将会增加4个字节。
But when I try to use this data-type with the input archive for serialization I get problem:
但是当我尝试使用这个数据类型和输入存档进行序列化时,我遇到了问题:
IPAddrV4 ip;
iarchive & ip;
This is the error which I get while compiling:
这是我在编译时得到的错误:
No match for 'operator&' in 'input_Archive & IPAddrV4::operator uint32()'
So what am I missing in the IPAddrV4?
那么IPAddrV4中缺少什么呢?
Note: The input archive works perfectly with the standard c++ data-types like uint,string..etc.
注意:输入存档与标准c++数据类型(如uint、string..等)完全一致。
2 个解决方案
#1
1
Boost Serialization has the BOOST_STRONG_TYPEDEF
for this purpose.
为此,Boost序列化具有BOOST_STRONG_TYPEDEF。
- http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/wrappers.html#strong_type
- http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/wrappers.html strong_type
See also
另请参阅
- How do I strongly typedef non-primitive types?
- 我如何强类型定义非基元类型?
- boost serialization of native type defined with typedef contained within struct
- 增强在struct中包含的typedef定义的本地类型的序列化。
#2
1
I found the error, I have to change the overloading of the operator uint32()
to be uint32&()
as following:
我发现了错误,我必须更改操作符uint32()的重载为uint32&()如下:
operator uint32 &()
{
return _ip_address;
}
In this way I return value by reference not by value for the input archive.
通过这种方式,我返回的值是引用而不是输入存档的值。
#1
1
Boost Serialization has the BOOST_STRONG_TYPEDEF
for this purpose.
为此,Boost序列化具有BOOST_STRONG_TYPEDEF。
- http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/wrappers.html#strong_type
- http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/wrappers.html strong_type
See also
另请参阅
- How do I strongly typedef non-primitive types?
- 我如何强类型定义非基元类型?
- boost serialization of native type defined with typedef contained within struct
- 增强在struct中包含的typedef定义的本地类型的序列化。
#2
1
I found the error, I have to change the overloading of the operator uint32()
to be uint32&()
as following:
我发现了错误,我必须更改操作符uint32()的重载为uint32&()如下:
operator uint32 &()
{
return _ip_address;
}
In this way I return value by reference not by value for the input archive.
通过这种方式,我返回的值是引用而不是输入存档的值。