Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Alx
1 / 1 / 0
Регистрация: 06.07.2011
Сообщений: 24
#1

Странное проявление перегрузки оператора и шаблонов классов - C++

12.12.2011, 02:24. Просмотров 346. Ответов 0
Метки нет (Все метки)

Очень странная проблема. Использование операторов + * / отличается от - в контексте внешнего класса

Точка возникновения проблемы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//
// Описание:        Выполнить математическую операцию
// REM:         с — Оп, n и m берутся из последних двух переменных
//
template <class T>
void  
    StraightPolishTranslator <T> :: call ( char c )
{
    makeNewConstant ( ); // Сгенерировать константу из последних символов
 
    switch ( c )
    {
    case( '+' ):
        varStc.push ( varStc.pop( ) + varStc.pop( ) );
    break;
    case( '-' ):
        varStc.push ( varStc.pop( ) - varStc.pop( ) );  "<== Здесь возникает ошибка компиляции"
    break;
    case( '*' ):
        varStc.push ( varStc.pop( ) * varStc.pop( ) );
    case( '/' ):
        varStc.push ( varStc.pop( ) / varStc.pop( ) );
    }
}
Ошибка:
Код
error C2664: AlxArcheve::QStack<T>::push: невозможно преобразовать параметр 1 из "int" в "CN"
т.е. операция вдруг возвращает int а не родной класс CN, который и ожидается функцией экземпляра класса QStack<CN> varStc.

Часть описания класса StraightPolishTranslator (функция которого использует проблемный оператор)
C++
1
2
3
4
5
6
7
8
9
10
11
// Шаговый конвертор польской записи
template < class T = CN >
class StraightPolishTranslator
{
    void          makeNewConstant ( );  // Записать const в цельном виде и очистить буфер
    void          call ( char );    // Выполнить математическую операцию 
// ............................................
public:
              StraightPolishTranslator ( );
// ............................................
};
Часть описания класса CN
C++
1
2
3
4
5
6
7
8
9
10
11
// Тип целых чисел в специальных правилах арифметики и произвольной системе счисления
class CN
{
// ............................................
const CN &    operator + ( CN & );
const CN &    operator - ( CN & );
// ............................................
const CN &    operator += ( CN & );
const CN &    operator -= ( CN & );
// ............................................
};
И в заключение класс QStack
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace AlxArcheve {
template < class T >
class QStack
{
private: 
    struct Node
    {
        T v;
        Node * n;
        Node ( T _v, Node * _n ): v (_v), n (_n) {}
    };
    Node * topN;
    unsigned int len;
 
public:
    QStack();//*
    // QStack(int size);//*
    QStack(const QStack*);
    QStack* operator=(QStack*);
    ~QStack();//*
 
    T pop ();// вернуть и удалить
    void push(T);//*
    bool empty();// isEmpty
    unsigned int size ();
 
    T top() const;
};
}
При этом как сложение, так и вычитание одинаково великолепно отрабатывают вне шаблонного класса StraightPolishTranslator.

С уважением, Александр.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2011, 02:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странное проявление перегрузки оператора и шаблонов классов (C++):

Функции для ввода/вывода массивов и матриц с помощью шаблонов и перегрузки - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; template&lt;class T&gt; int mass(T mas, T iSize = sizeof(mas) /...

Целесообразность перегрузки оператора - C++
Изначально имелся такой вот метод (пусть будет методом класса &quot;A&quot;): //класс &quot;A&quot;, константная версия метода const Order &amp;operator...

Ошибка перегрузки оператора - C++
Здравствуйте уважаемые программисты, при созданиии проэкта возникает ошибка In function 'int main()': 154 10 no 'operator++(int)'...

Особенонсти перегрузки оператора запятая - C++
Препод на защите прошлой лабы задал вопрос - чем отличается перегрузка оператора запятая от других... Перерыл кучу статей, пишут только,...

Friend-функции перегрузки оператора - C++
Всем доброго времени суток =) У меня есть следующий код заголовочного файла: enum month {jan = 1, feb, mar, apr, may, jun, jul, aug, sep,...

Ошибка из книги оператора перегрузки - C++
// Листинг 10.10. // Возвращение безымянного временного объекта #include &lt;string&gt; #include &lt;iostream&gt; // для объекта cout using...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2011, 02:24
Привет! Вот еще темы с ответами:

Вопрос по поводу перегрузки оператора + - C++
Всем привет.Подскажите как можно перегрузить оператор + в моем классе? И что лучше вернуть из перегруженной операции +=? Объект или...

Аналог перегрузки оператора индексирования (operator []) - C++
Как по-другому(то есть в виде обычной функции или как то ещё) можно записать перегрузку оператора индексирования? Например в моём случае:...

Ошибка в алгоритме перегрузки оператора присваивания - C++
Добрый вечер. Пишу методы для класса по своему заданию. Столкнулся с проблемой перегрузки оператора присваивания для метода поиска. Привожу...

По поводу потока и перегрузки оператора вставки в классе - C++
#include &lt;iostream&gt; using namespace std; class three_d { public: int x, y, z; three_d(int a, int b, int c) { x=a; y=b; z=c; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru