从派生模板特化函数引用基类属性

时间:2014-09-15 15:39:36

标签: c++ templates inheritance

假设我们有一个基类,除了包含其他值之外什么也不做,并对它们执行某些操作,例如打印它们:

template <typename T>
class Base {
    public:
        Base (const T& t) : value(t) {}
        void printValue () {
            cout << value << endl;
        }

    protected:
        T value;
};

然后让我们说我们想从这个模板类派生来提供额外的功能。为了便于讨论,我将保持简单,只是说我们正在添加更改包含对象值的功能。设置value = t不适用于派生模板函数,但使用this->限定值将会:

template <typename T>
class Derived: public Base<T> {
    public:
        Derived (const T& t) : Base<T>(t) {}

        void setValue (const T& t) {
            this->value = t;
        }
};

但现在,让我们说我想为某些类型的实例化对象专门化一个函数。比如,如果类型可以递增,比如int,我想提供该功能:

template <>
class Derived<int> {
    public:
        void increment () {
            this->value++;
        }
};

这不起作用,因为编译器不会识别基类&#39;财产value。我还尝试在增量之前插入一个using Base<int>::value声明,它仍然无法工作(至少,不是用g ++)。我收到编译器错误‘Base<int>’ is not a namespace

有没有办法引用基本模板类&#39;来自专业模板功能的属性?使用this->适用于派生模板类,但不适用于派生类的专用函数。我还发现将using Base<T>::value置于Derived::setValue而不是使用this->并不起作用,尽管我认为应该这样做。有什么想法吗?

更新:这是完整的代码:

    template <typename T>
    class Base {
        public:
            Base (const T& t) : value(t) {}
            void printValue () {
                cout << value << endl;
            }

        protected:
            T value;
    };

    template <typename T>
    class Derived: public Base<T> {
        public:
            Derived (const T& t) : Base<T>(t) {}

            void setValue (const T& t) {
                this->value = t;
            }
    };

    template <>
    class Derived<int>: public Base<int> {
        public:
            void increment () {
                //using Base<int>::value;
                this->value++;
            }
    };

这些是错误:

templatebase.cpp: In function ‘int main()’:
templatebase.cpp:36:21: error: no matching function for call to ‘Derived<int>::Derived(int)’
templatebase.cpp:36:21: note: candidates are:
templatebase.cpp:27:7: note: constexpr Derived<int>::Derived(const Derived<int>&)
templatebase.cpp:27:7: note:   no known conversion for argument 1 from ‘int’ to ‘const Derived<int>&’
templatebase.cpp:27:7: note: constexpr Derived<int>::Derived(Derived<int>&&)
templatebase.cpp:27:7: note:   no known conversion for argument 1 from ‘int’ to ‘Derived<int>&&’

0 个答案:

没有答案