Wat betekent de fout “verwacht” (‘voor functie-stijl of type constructie’?

Ik krijg de foutmelding “verwacht” (‘voor functie-stijl cast of type constructie “, en heb mijn best gedaan om de betekenis van deze fout online te onderzoeken, maar geen documentatie van wat dit kan vinden. fout.

Alle gerelateerde vragen over stapeloverloop die ik heb gevonden die ik heb gevonden een specifieke codefragment en leg het niet meer in het algemeen uit wat de fout veroorzaakt.

Deze omvatten

  1. verwacht ‘(‘ voor functie-stijl cast of type constructie Antwoord benadrukt verschillende problemen met de code. Welk probleem veroorzaakt eigenlijk de fout is onduidelijk.
  2. C++ Xcode verwacht ‘(‘ voor functie- Stijlcast of type constructie definieert functies in een hoofdfunctie. Dit lijkt een duidelijk syntaxsprobleem, maar waarom deze specifieke fout wordt geproduceerd, is nog steeds onduidelijk voor mij.
  3. ‘(‘ voor functie-stijl cast of constructietype Xcodefout . In dit laatste voorbeeld noemt de OP een functie op een manier die lijkt op een functieverklaring, plus ze verklaren een functie met dezelfde naam maar een andere handtekening. Gebaseerd op waar de fout wordt gegooid. en het bericht van de fout, het lijkt erop dat de fout iets te maken heeft met functieverklaringen.

Kan ik een antwoord in documentatie-stijl krijgen die vertaalt wat ‘functie-stijl cast’ en “Type Construction” betekent in eenvoudig Engels? Wanneer kiest de compiler ervoor om deze fout te gooien in plaats van een andere fout?

Ik wil geen antwoord dat specifiek is voor mijn eigen fout, maar zoals gevraagd, hier is mijn MCVE

#include <boost/integer_traits.hpp>
class Test{
    const double MAX_DEPTH_VAL = (double) boost::integer_traits<unsigned short>.const_max;
    const double MIN_DEPTH_VAL = (double) boost::integer_traits<unsigned short>.const_max;
};

Ik werd ertoe gebracht te geloven dat deze syntaxis mogelijk was, door dit antwoord https://stackoverflow.com/a/2738576/3303546


Antwoord 1, autoriteit 100%

Dit is een syntaxisfout. Nu kunnen niet-programmeurs of amateurs de term syntaxisfouthoren en deze gelijkstellen aan een algemene bug. Maar in C++ (en andere talen) heeft het een meer specifieke betekenis.

Er is een taalgrammatica, een set regels waarmee de compiler verdeelt in een vroeg stadium van de vertaling de broncode in logische groepen. Dit is voordat er enige betekenis aan die groepen wordt toegekend (dat deel wordt soms semantische controlegenoemd).

De syntaxisfout die u zag, betekent dat de compiler de broncode niet kon afstemmen op de grammaticaregels voor C++. Juist omdat het dit niet kon — het is moeilijk voor de compiler om te weten wat de programmeur van plan was. Syntaxisfoutmeldingen zijn dus vaak gissingen of hebben geen betrekking op de bedoeling van de programmeur.

Als je deze fout ziet, stelt de compiler een manier voor om de code te wijzigen die mogelijk overeenkomt met een van de grammaticaregels, maar dat kan in de situatie al dan niet een goede oplossing zijn.

U kunt dit soort fout behandelen, net als “algemene syntaxisfout”, niet te veel zorgen te maken over de details van de fout. Om het op te lossen, ga dan terug naar eenvoudiger uitdrukkingen die u zeker weet, geen syntaxisfouten zijn en vervolgens opbouwt naar wat u wilde schrijven.

Een analogie voor Engelse taal is misschien de zin “I De kamer gingen”. Stel je een aantal taalvertalingssoftware voor. Dit komt niet overeen met elke bekende zinsstructuur, maar welk foutbericht kan het rapporteren? De werkelijke suggesties zullen u waarschijnlijk niet helpen om de zin op te lossen.


In uw specifieke voorbeeld is er een syntaxisfout. Het bericht G ++ is anders:

FOUT: verwachte primaire expressie vóór ‘.’ token

Waar primaire expressie is een vermelding in de C++ grammatica. G ++ ziet de .Token en gaat ervan uit dat u de Lid Access-operator bedoelt. Maar de grammatica zegt dat de linker operand van de lid van de lidtoegang een primaire expressie (en de semantische regels zeggen, zeggen dat deze primaire expressie het object aanduidt waarvan u lid wilt openen).

In uw werkelijke code is de linkerzijde echter (double) boost::integer_traits<unsigned short>die niet overeenkomt met de Grammatica-specificatie voor Primaire expressie . (In feite is het een type naam). De compiler kan hier niet verder doorgaan, dus het borgt uit.

Uw compiler heeft ook niet overeengekomen bij de code aan een grammaticelregel, maar het raadde met het geraadpleegd dat u probeerde een cast- of typeconstructie-stijl te schrijven.

“Function-style cast” betekent code zoals int(5.0), dus misschien herkende het boost::integer_traits<unsigned short>als een typenaam, en het vermoedde dat je boost::integer_traits<unsigned short>(const_max)bedoelde, dwz het casten van een variabele const_maxnaar dat type.

Ik weet niet zeker wat je compiler hier bedoelt met “type constructie”.

NB. Als je wilt weten hoe je de eigenlijke code in je vraag kunt oplossen, raad ik je aan een nieuwe vraag te beginnen waarin je de code en het foutbericht plaatst en vraagt hoe je de code kunt herstellen.

Other episodes