如何使用模板类型的向量?

时间:2014-03-28 05:08:49

标签: c++ templates

我希望有两个模板结构用于将任何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;
    }
};

3 个答案:

答案 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();

请查看vector<T>::iterator - invalid?

答案 2 :(得分:0)

  

虽然第一个编译

我对此不太确定。模板生成的代码只要您的其他代码使用它就会得到编译。

在两个结构中,您从const声明的函数访问非const变量成员。您可以从函数中删除const关键字,或者需要将mutable关键字添加到变量中。