我有以下typedef:
typedef std::pair<std::string, std::string> iprange;
typedef std::set<iprange> iprange_set;
当我尝试在iprange
和iprange_set
周围编写lexical_cast时,其他类型如Json::Value
或std:string
编译器发出错误,因为typedef
是boost::lexical_cast
只是别名不是真正的类型,所以它不能超载。
有没有办法让一个类型显示现有类型的属性而没有typedef?
我正在寻找的结果是我应该能够使用该类型声明变量,并将其用作#include <iostream>
#include <string>
#include <set>
#include <boost/lexical_cast.hpp>
using namespace std;
typedef set<string> ipaddr_list;
namespace boost {
template<>
string lexical_cast(const ipaddr_list* const & list)
{
return "qwe"; //actually code do convert ipaddr_list to string
}
};
int main()
{
ipaddr_list l;
l.insert("45.5.5.5-56.6.6.6");
string s = boost::lexical_cast<string>(l);
}
发布代码
input_file = open("nameOfFile.csv","r+")
编译器给出以下错误:
test.cpp中包含的文件:4: /usr/include/boost/lexical_cast.hpp:349:13:错误:未定义模板的隐式实例化 &#39;的boost :: STATIC_ASSERTION_FAILURE&#39; BOOST_STATIC_ASSERT_MSG((result_t :: value || boost :: has_left_shift&lt; std :: basic_ostream&lt; type&gt;,T&gt; :: value), ^ 还有一些
答案 0 :(得分:3)
您为lexical_cast(const ipaddr_list*)
提供了一个专门化 - 一个带指针的函数。但是你并没有称之为专业化 - 你实际上并没有将指针传递给lexical_cast
。相反,您正在调用通用实现,该实现尝试将ipaddr_list
实例发送到流,但自然无法找到operator<<
的合适重载。这就是断言告诉你的。