2015-10-02 2 views
0

Это было время для C++, у меня есть класс Number и несколько подклассов, таких как Integer, Decimal .. Я бы хотел переопределить == operator для сравнения, когда число num num равно числу ... у меня есть что-то вроде следующего, но не могу показаться, чтобы выяснить синтаксис для подкласса потомком класса шаблона, а также синтаксис для переопределения == оператора в подклассе ...Как наследовать от Template class C++

template class <T> 
class Number{ 
    T data; 
    Number(T num) { data = num ;} 
    boolean operator==(T &other){ return data == other; } 
} 

class Integer : public Number{ 
int iData; 
Integer(int i) { iData = i ; } 
boolean operator==(Integer &other){ return idata == other.iData; } 

} 
+0

Это уже answere [здесь.] (Http://stackoverflow.com/q/8810224/1032073) – celtschk

+0

'class' должен быть внутри' <> 'в' шаблоне Number' – sp2danny

+0

, вам также нужно закончить объявления классов с помощью ';' – sp2danny

ответ

1

Вы должны указать специализацию , как Number<int>. В противном случае вы не сможете наследовать шаблон, если только ваш производный класс не является самим шаблоном. В вашем коде есть и другие ошибки, например, упомянутые в комментариях, а также оператор operator==, который должен принимать в качестве параметра const Number<T>&. Поэтому в вашем случае используйте, например,

class Integer : public Number<int> 

После того, как вы сделаете это, нет необходимости больше для реализации operator== в производном классе, так как он будет наследоваться. Полный рабочий код ниже:

#include <iostream> 

template <class T> 
class Number 
{ 
public: 
    T data; 
    Number(T num): data(num){} 
    bool operator==(const Number<T> &other) { return data == other.data; } 
}; 

class Integer : public Number<int> 
{ 
    using Number<int>::Number; // inherit the constructor 
}; 

int main() 
{ 
    Integer i1 = 10, i2 = 20; 
    std::cout << std::boolalpha << (i1 == i2); 
} 

Live on Coliru

+0

Спасибо, но я хочу переопределить оператор, чтобы делать разные вещи в подклассах. – user1529412

+0

@ user1529412 Вы все равно можете перегрузить его, если вы не хотите поведения в базовом классе, например 'bool operator == (const Integer & other) {return data == other.data; } ' – vsoftco

+0

Отлично, но часть меня сбивает с толку (см. Ниже), Как я могу подклассифицировать другие вещи, такие как Фракция, \t Как бы это сделать для класса Фракция: public Number < ?? >, фракция может иметь число int и int denom , – user1529412

0

либо

template<class T> 
class Integer : public Number<T> { 

или

class Integer : public Number<int> { 

в зависимости от того, если вы хотите Integer быть шаблон слишком или не

+0

Как бы это сделать для класса Фракция: общедоступная Номер < ?? >, также как насчет оператора ==? – user1529412

+0

Я не думаю, что это хорошая идея для 'Fraction' наследовать от' Number'. – sp2danny

+0

Почему не дробь является числом. – user1529412

0

Использование

template<class T> 
class Number{ 
    T data; 
    Number(T num) { data = num ;} 
    boolean operator==(T &other){ return data == other; } 
}; 

template<typename T> 
class Integer : public Number<T> { 
int iData; 
Integer(int i) { iData = i ; } 
boolean operator==(Integer &other){ return idata == other.iData; } 

}