与模板c ++一起提升递归变量

时间:2017-08-10 20:52:01

标签: c++11 templates boost-variant

我试图理解boost递归变量和模板。对于下面的代码,我得到编译错误

cannot convert argument 1 from 'std::vector<std::string,std::allocator<_Ty>>' to 'const Boost::variant<boost::detail::variant::recursive_flag<T0>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> &'

错误似乎源于GetVarValue()函数

根据我的承诺,我可以使用_default类:可以是int,string,bool,double的向量,int / string / bool / double的向量对吗?

    typedef boost::make_recursive_variant<
        int,
        std::string,
        bool,
        double,
        std::vector<boost::recursive_variant_> >::type TokenValueType;


    template<class T>
    class VectorToken : public Token
    {
    private:

        string _name;

        vector<T> _default;

    public:
        VectorToken(string name, vector<T> defaultVal)
            : _name(name)
        {
            _default = defaultVal;
        }

        virtual TokenValueType GetVarValue()
        {
            return _default;  <-- _default (vector<string>) doesn't like TokenValueType ?
        }
    };

    main()
    {
        vector<string> tempvec = {"ABC", "LMN", "PQR"};
        VectorToken<string> t4 = VectorToken<string>::VectorToken("VECTORSTR", tempvec);
    }

当我像这样写主要时,错误就消失了:

main()
{
    vector<TokenValueType> tempvec = { string("ABC"), string("LMN"), string("PQR") };
    VectorToken<TokenValueType> t4 = VectorToken<TokenValueType>::VectorToken("VECTORSTR", tempvec);

}

1 个答案:

答案 0 :(得分:0)

我将简化这种类型:

typedef boost::make_recursive_variant<
    int,
    std::string,
    std::vector<boost::recursive_variant_> >::type TokenValueType;

这应该足以解释它。

TokenValueType 不是变量(int的向量,字符串的向量,TokenValueType的向量的向量)。

它是一个向量(int或string或TokenValueType)。

以下是MCVE,其中您的语法错误已更正并且更改了一行:

return std::vector<TokenValueType>(_default.begin(), _default.end());