ISO C++ forbids declaration

Status
Niet open voor verdere reacties.

Tklaversma

Nieuwe gebruiker
Lid geworden
16 jul 2010
Berichten
3
Hallo,

Ik als beginnend C++ programmeur zit met een probleem. Ik heb letterlijk iets overgenomen uit mijn studieboek "C++ How to Program 7e", maar alsnog krijg ik de volgende foutmelding:

"main.cpp:19: error: ISO C++ forbids declaration of `GradeBook' with no type"

Hieronder zien jullie mijn volledige code:

[CPP]/*
* File: main.cpp
* Author: Tim
*
* Created on 13 juli 2010, 22:04
*/

#include <iostream> //allows program to perform input and output
#include <string>
using namespace std;

/**
*
* @param coursename
*/
class Gradebook {
public:

GradeBook(string name) {
setCourseName(name);
}

void setCourseName(string name) {
courseName = name;
}

string getCourseName() {
return courseName;
}

void displayMessage() {
cout << "Welcome to the grade book for\n" << getCourseName() << "!"
<< endl;
}
private:
string courseName;
};

/**
*
* @return
*/
int main() {

Gradebook gradeBook1("1");
Gradebook gradeBook2("2");

cout << "gradebook1: " << gradeBook1.getCourseName() << endl;
cout << "gradebook2: " << gradeBook2.getCourseName() << endl;

return 0;
}[/CPP]

Ik hoop dat jullie mij kunnen helpen met het zoeken van de fout(en)?


MVG,

Tim
 
Staat toch vrij duidelijk aangegeven: Op regel 19 wordt GradeBook gedeclareerd, maar die moet van een bepaald type zijn.
GradeBook(string name) {
setCourseName(name);
}

Zou dus (afhankelijk van wat Gradebook moet gaan doen (lijkt alleen een aanroep van een andere procedure)) gedeclareerd moeten worden, bijv. als void, dus bijv.

void GradeBook(string name) {
setCourseName(name);
}

Succes,

Tijs.
 
Laatst bewerkt:
Nog steeds een foutmelding.. =(

[CPP]void GradeBook(string name) {
setCourseName(name);
}[/CPP]

is niet de oplossing.. Het gaat hier om de constructor van de class GradeBook. Waarom zou dat een void moeten zijn?
Maar hieronder kunt u de foutmelding zien met wanneer ik void heb gebruikt:

Code:
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin-Windows/cppapplication_1.exe
make[2]: Entering directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'
mkdir -p build/Debug/Cygwin-Windows
rm -f build/Debug/Cygwin-Windows/main.o.d
g++    -c -g -MMD -MP -MF build/Debug/Cygwin-Windows/main.o.d -o build/Debug/Cygwin-Windows/main.o main.cpp
main.cpp: In function `int main()':
main.cpp:45: error: no matching function for call to `Gradebook::Gradebook(const char[2])'
main.cpp:16: note: candidates are: Gradebook::Gradebook()
main.cpp:16: note:                 Gradebook::Gradebook(const Gradebook&)
main.cpp:46: error: no matching function for call to `Gradebook::Gradebook(const char[2])'
main.cpp:16: note: candidates are: Gradebook::Gradebook()
main.cpp:16: note:                 Gradebook::Gradebook(const Gradebook&)
main.cpp:52:2: warning: no newline at end of file
make[2]: *** [build/Debug/Cygwin-Windows/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'
make[1]: Leaving directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'

BUILD FAILED (exit value 2, total time: 2s)


en hieronder ziet u de foutmelding zonder void:

Code:
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin-Windows/cppapplication_1.exe
make[2]: Entering directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'
mkdir -p build/Debug/Cygwin-Windows
rm -f build/Debug/Cygwin-Windows/main.o.d
g++    -c -g -MMD -MP -MF build/Debug/Cygwin-Windows/main.o.d -o build/Debug/Cygwin-Windows/main.o main.cpp
main.cpp:19: error: ISO C++ forbids declaration of `GradeBook' with no type
main.cpp: In function `int main()':
main.cpp:45: error: no matching function for call to `Gradebook::Gradebook(const char[2])'
main.cpp:16: note: candidates are: Gradebook::Gradebook()
main.cpp:16: note:                 Gradebook::Gradebook(const Gradebook&)
main.cpp:46: error: no matching function for call to `Gradebook::Gradebook(const char[2])'
main.cpp:16: note: candidates are: Gradebook::Gradebook()
main.cpp:16: note:                 Gradebook::Gradebook(const Gradebook&)
make[2]: Leaving directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'
make[1]: Leaving directory `/cygdrive/d/Documenten/NetBeansProjects/CppApplication_1'
main.cpp:52:2: warning: no newline at end of file
make[2]: *** [build/Debug/Cygwin-Windows/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 2s)
 
main.cpp:45: error: no matching function for call to `Gradebook::Gradebook(const char[2])'
main.cpp:16: note: candidates are: Gradebook::Gradebook()
main.cpp:16: note: Gradebook::Gradebook(const Gradebook&)

main.cpp:19: error: ISO C++ forbids declaration of `GradeBook' with no type
main.cpp: In function `int main()':
main.cpp:45: error: no matching function for call to `Gradebook::Gradebook(const char[2])'
main.cpp:16: note: candidates are: Gradebook::Gradebook()
main.cpp:16: note: Gradebook::Gradebook(const Gradebook&)

Zie dat mét de declaratie als void van Gradebook er 1 fout minder is! Verder blijven de andere foutmeldingen gelijk.
Ik heb me niet gericht op die andere foutmeldingen; die foutmelding over regel 19 ben je ermee kwijt.
Daarnaast dien jij te weten of de functie GradeBook evt. nog een return-waarde moet hebben of niet (met void is er geen returnwaarde).

Tijs.
 
Laatst bewerkt:
@dnties: Ik vermoed dat jij nog geen ervaring hebt met het programmeren van classes?

De constructor van een klasse heeft geen return type, zelfs geen void. Je kan wel een return statement in je constructor plaatsen om hem voortijdig te beëindigen, maar dit return statement mag onder geen geval een argument hebben!
Je kan het resultaat van een constructor wel opvangen in een variabele van dat type, dus je zou kunnen stellen dat een constructor als return value het object heeft dat ie net heeft aangemaakt. (en eigenlijk is dit ook zo) Alleen moet je hier ongeloofelijk goed opletten voor datacorruptie, want de variabele die dat object opvangt is ongeldig van zodra de scope waarin de constructor werd aangeroepen eindigd.

De oplossing: Tim, je had gewoon een kleine tikfout gemaakt. Kijk eens heel goed naar de naam van je classe en de naam van je constructor.. Er is 1 letter verschillend, waardoor dit dus niet klopt.

En Tim, nog een laatste vraag voor jou: welke ontwikkelomgeving gebruik jij? Toen ik je code namelijk in mijn IDE plakte, kreeg ik meteen een 'syntax error' op je constructor, waardoor ik meteen wist dat er een tikfout was.
 
Ik gebruik NetBeans IDe 6.9..

In welke programma kan ik het beste C++ programmeren?
 
hmm.. NetBeans is een uitstekende editor naar wat ik ervan hoor.
Maar blijkbaar maakt ie geen gebruik van een live syntax-parser ofzo, geen idee hoe dat in NetBeans juist zit.

Zelf gebruik ik de CDT-plugin van Eclipse, maar die heeft ook zijn reeks nadelen, vooral op het gebied van debugging vind ik.

In elk geval weet je nu dat de foutmelding die je kreeg dus ook gewoon het gevolg van zo'n stomme typefout kan zijn :)
 
Ik heb de fout nu ook gevonden. Ik gebruik trouwens, net als de topic-starter, Gnu C++ maar dan met DEV C++ als IDE / compileeromgeving.

Tijs.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan