创建一个与STL容器std :: set

时间:2017-06-01 10:32:02

标签: c++ c++11

我有以下typedef:

typedef std::pair<std::string, std::string> iprange;
typedef std::set<iprange> iprange_set;

当我尝试在iprangeiprange_set周围编写lexical_cast时,其他类型如Json::Valuestd:string编译器发出错误,因为typedefboost::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),             ^ 还有一些

1 个答案:

答案 0 :(得分:3)

您为lexical_cast(const ipaddr_list*)提供了一个专门化 - 一个带指针的函数。但是你并没有称之为专业化 - 你实际上并没有将指针传递给lexical_cast。相反,您正在调用通用实现,该实现尝试将ipaddr_list实例发送到流,但自然无法找到operator<<的合适重载。这就是断言告诉你的。