Eerst, Parameter.h
:
#pragma once
#include <string>
class Parameter {
public:
Parameter();
~Parameter();
private:
string constValue;
string varName;
};
En Parameter.cpp
:
#include "Parameter.h"
using namespace std;
Parameter::Parameter() {};
Parameter::~Parameter() {};
Ik heb deze twee bestanden tot op het bot teruggebracht om de fouten te krijgen die lijken op te duiken. Bij de twee privédeclaraties voor string
s krijg ik de twee fouten:
'constValue': unknown override specifier
missing type specifier - int assumed. Note: C++ does not support default-int
Ik heb verschillende vragen met deze fouten gezien, maar elk verwijst naar circulaire of ontbrekende verwijzingen. Omdat ik het heb uitgekleed tot wat absoluut vereist is, zie ik geen kringverwijzingen of verwijzingen die ontbreken.
Enig idee?
Antwoord 1, autoriteit 100%
Zoals @Pete Becker in de opmerkingen aangeeft, moet je de naam string
kwalificeren als std::string
:
private:
std::string constValue;
std::string varName;
De compiler weet gewoon niet waar je het over hebt, en het is het equivalent van gewoon schrijven:
SomeGreatType myMagicalUniversalType
De compiler weet alleen niet welk type dat is, tenzij je het hebt gedeclareerd, vandaar de fout
ontbrekende typespecificatie – int verondersteld
Je moet lezen over waarom je using namespace std;
.
Met betrekking tot uw vraag in de opmerkingen:
In alle (werk)klassen die ik heb geschreven, heb ik nooit de std:: ingevoerd, in plaats daarvan vertrouwend op het gebruik van de naamruimte std; in het .cpp-bestand. Waarom zou deze anders zijn?
Ik kan alleen maar concluderen dat op een bepaald moment voordat ik “Parameter.h” heb toegevoegd, dat je een using namespace std
had. Bijv.:
// SomeType.h
#using namespace std
...
// Parameter.cpp
#include "SomeType.h"
#include "Parameter.h"
De compiler compileert dingen van boven naar beneden, en inclusief vervangt in wezen gewoon de #include
met de inhoud van dat bestand