假设我们有一个基类,除了包含其他值之外什么也不做,并对它们执行某些操作,例如打印它们:
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>&&’