我希望有两个模板结构用于将任何Variant类型转换为std::strings
;
第一个编译时,第二个编译,vector<Variant>::iterator statement
。编译器说:
error: expected ';' after expression
vector<Variant>::iterator i = data.begin();
知道我做错了什么吗?对于我在这里尝试做的事情,还有更好的方法吗?
template <typename Variant>
struct to_string
{
private:
Variant data;
public:
to_string(Variant &d) : data(d) {}
operator std::string() const
{
try
{
return boost::lexical_cast<std::string>(data);
}
catch (const boost::bad_lexical_cast &)
{
return std::string();
}
}
};
template <typename Variant>
struct to_string_vector
{
private:
vector<Variant> data;
public:
to_string_vector(vector<Variant> &d) : data(d) {}
operator vector<std::string> () const
{
vector<string> ret;
vector<Variant>::iterator i = data.begin();
to_string t_s<Variant> s = to_string<Variant>(*i);
ret.push_back((string)s);
return ret;
}
};
答案 0 :(得分:3)
你需要
typename vector<Variant>::iterator
当访问在模板化类型范围内定义的子类或typedef时,编译器会感到困惑,需要帮助将它们标识为类型。
编辑:(我的完整程序,修复一些const ....注释了boost部分,因为我现在没有可访问的增强功能......并添加了代码来实例化模板)。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template <typename Variant>
struct to_string
{
private:
Variant data;
public:
to_string(const Variant &d) : data(d) {}
operator std::string() const
{
//try
//{
//return boost::lexical_cast<std::string>(data);
//}
//catch (const boost::bad_lexical_cast &)
//{
return std::string();
//}
}
};
template <typename Variant>
struct to_string_vector
{
private:
vector<Variant> data;
public:
to_string_vector(const vector<Variant> &d) : data(d) {}
operator vector<std::string> () const
{
vector<string> ret;
typename vector<Variant>::const_iterator i = data.begin();
to_string<Variant> s = to_string<Variant>(*i);
ret.push_back((string)s);
return ret;
}
};
int main(int argc,char **argv) {
to_string<int> a(10);
string sa=(string)a;
vector<int> v;
to_string_vector<int> b(v);
vector<string> sb=(vector<string>)b;
}
答案 1 :(得分:1)
更改vector :: iterator i = data.begin();到
typename vector :: iterator i = data.begin();
答案 2 :(得分:0)
虽然第一个编译
我对此不太确定。模板生成的代码只要您的其他代码使用它就会得到编译。
在两个结构中,您从const声明的函数访问非const变量成员。您可以从函数中删除const关键字,或者需要将mutable关键字添加到变量中。