![]() |
в чём ошибка ?
компилятор пишет ошибку с строке объявления функции
" redefinition; different type modifiers " что это значит подскажите кто-нибудь :moderator |
KEKS-KEKS, не плохо бы приводить код с которым проблемы.
Может быть примерно такая проблема: Код:
int __stdcall function(int a, int b); |
Вот код функции , весь код слишком большой не хочу вас грузить . Где ошибка я показал
float Accumulator ( const char theOperator,const float theOperand=0 ) { " ошибка в этой строке" static float myAccumulator=0; switch (theOperator) { case '+': myAccumulator=myAccumulator+theOperand; Tape(theOperator,theOperand); break; case '-': myAccumulator=myAccumulator-theOperand; Tape(theOperator,theOperand); break; case '*': myAccumulator=myAccumulator*theOperand; Tape(theOperator,theOperand); break; case '/': myAccumulator=myAccumulator/theOperand; Tape(theOperator,theOperand); break; case '@': myAccumulator=theOperand; Tape(theOperator,theOperand); break; case '=': cout<<endl<<myAccumulator<<endl; break; case '?': Tape(theOperator,0); break; default: throw runtime_error ("ERROR - INVALID OPERATOR - must be one of +,-,*, or /"); }; return myAccumulator; } |
KEKS-KEKS, научитесь пользоваться тегом [[code]] и научитесь прикладывать файлы к сообщениям. Ибо телепаты традиционно в отпуске. Лучше весь проект зазипованный.
|
Спасибо. Буду учиться.
|
Вложений: 5
Шлю всё :read:
|
Во-перых, стандартный заголовочный файл stdexcept, а не exception.
Во-вторых, вы используете функцию Accumulator предварительно её не объявив. Ваш компилятор по старой сишной привычке (в c++ так делать _нельзя_, поэтому мой компилятор например на это ругается) "угадывает" тип этой функции, как: int Accumulator (char , float); но ниже Accumulator описан как: float Accumulator (char , float); Т.е. отличается _только_ типом результата. А такая перегрузка (по типу результата, а не аргументов) в С++ запрещена. Вывод простой: всегда давайте прототипы используемых функций. Ниже код файла main.cpp с минимальными исправлениями, чтобы компилировалось. Править всё что мне не нравится лень (а не нравится довольно многое). Код:
#include <iostream> |
Спасибо буду разбираться.
|
ivank, Прошу меня извинить , я ведь только учусь. Но я не нашёл где у меня
Цитата:
Цитата:
char GetOperator(void) float GetOperand(void) bool TestOK void SelfTest(void) void Tape(const char theOperator,const float theOperand) float Accumulator ( const char theOperator,const float theOperand=0 ) - вот она объявлена :read: или я чего-то недогоняю :blush: |
KEKS-KEKS
В C++ любая функция должна быть объявлена (или определена полностью) _до_ её первого использования. В первый раз функция Accumulator используется в TestOK, т.е. _до_ её определения. В языке си так делать можно было. При этом тип формальных аргументов функции определялся по типу фактических. А типом результата объявлялся int. Таким образом при первом использовании функции Accumulator вы _неявно_ определяете её как "int Accumulator (char , float);". Но позже (уже явно) определяете как "float Accumulator (char , float);", т.е. с точки зрения компилятора пытаетесь перегрузить её по типу результата, чего делать нельзя (на что он и ругается). Но вообще ваш компилятор не прав (ибо старенький, бедняжка), в том, что пытается быть похожим на C. В C++ использовать функцию предварительно её не объявив нельзя вообще, и поэтому в первый раз компилятор д.б. ругнуться ещё на строку 25, сказав, что ему неизвестна функция Accumulator. Именно так делает, например, мой компилятор (g++4). |
О, как в Паскале. Пока не объявишь, не поедешь :)
|
ivank, Спасибо, дошло до меня. Я поменял местами объявление функций и всё получилось. Теперь их очерёдность такая :
void Tape(const char theOperator,const float theOperand) float Accumulator ( const char theOperator,const float theOperand=0 ) char GetOperator(void) float GetOperand(void) bool TestOK void SelfTest(void) и компилятор их пропускает. А ты голова :clapping: |
Время: 13:49. |
Время: 13:49.
© OSzone.net 2001-