7

我有这个类模板

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>'

this->在前面添加value没有帮助。

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

谢谢

4

2 回答 2

6

类模板的各种特化是完全不相关的。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()虚拟化。

于 2013-09-19T14:36:07.567 回答
4

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

template<>
void Wrapper<int>::parse(std::string s)
{
    this->value = atoi(s.c_str());    
}
于 2013-09-19T14:39:00.123 回答