【问题标题】:Member access and template specialization成员访问和模板专业化
【发布时间】:2013-09-24 16:49:53
【问题描述】:

我有这个类模板

template <typename T>
class Wrapper
{
    public:
        virtual void parse(std::string s) = 0;

    protected:
        T value;
};

理想情况下,每种类型都应该知道如何从字符串中解析自己,因此我希望拥有诸如

之类的专业化
template<>
class Wrapper<int> 
{
    public:
        virtual void parse(std::string s) 
        {
            value = atoi(s.c_str());
        }
};

但是,显然,我无法从主模板访问“值”成员。我得到的是这样的:

In member function 'virtual void Wrapper<int>::parse(std::string)':
error: 'value' is not a member of 'Wrapper<int>'

value 前面添加this-&gt; 没有帮助。

您知道如何解决这个问题吗?

谢谢

【问题讨论】:

    标签: c++ templates inheritance template-specialization member-functions


    【解决方案1】:

    类模板的各种特化完全不相关Wrapper&lt;int&gt; 不知道任何关于例如Wrapper&lt;char&gt;。所以你需要为每个特化单独定义数据成员

    template<>
    class Wrapper<int> 
    {
        public:
            virtual void parse(std::string s) 
            {
                value = atoi(s.c_str());
            }
        protected:
            int value;
    };
    

    还有parse()前面的virtual关键字的问题。除非您打算将 Wrapper&lt;int&gt; 作为一个基类,并且可以通过后续派生类重新定义其 parse() 方法,否则您在这里不需要它。如果您要做的只是创建各种Wrapper&lt;&gt; 特化,那么您不应该将parse() 虚拟化。

    【讨论】:

    • @tunnuz 和这里的protected 关键字类似:您似乎不需要它,而且一般不建议拥有这样的数据。只需将您的数据设为private
    • hmmm,如果模板专业化类必须重新定义它自己的所有数据成员和方法,我怀疑为什么不写一个全新的类?
    【解决方案2】:

    我想我解决了,诀窍是只专门化成员函数,而不是整个类

    template<>
    void Wrapper<int>::parse(std::string s)
    {
        this->value = atoi(s.c_str());    
    }
    

    【讨论】:

    • 这有效,但仅适用于完全专业化,不适用于部分专业化(例如,不适用于 std::vector&lt;T&gt;T*
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2022-01-24
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多