成员访问和模板专业化

时间:2013-09-19 14:27:34

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

我有这个课程模板

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());
        }
};

然而,显然,我无法从主模板访问“value”成员。我得到的是:

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

this->前添加value无效。

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

由于

2 个答案:

答案 0 :(得分:5)

类模板的各种专业化相互完全不相关Wrapper<int>对此不了解Wrapper<char>。因此,您需要单独定义每个专业化的数据成员

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

virtual前面还有parse()关键字的问题。除非您希望Wrapper<int>成为可以通过后续派生类重新定义其parse()方法的基类,否则此处不需要它。如果您要做的只是创建各种Wrapper<>专精,那么您不应该parse()虚拟。

答案 1 :(得分:3)

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

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