Elikkä tälläistä virhettä tulee. Oisko jollakin vinkkejä missä vika ?
1>------ Build started: Project: D3DDrv, Configuration: Debug Win32 ------ 1>Compiling... 1>D3DDrv.cpp 1>d:\\development\src\engine\inc\unstats.h(70) : error C2664: 'FD3DCounter::FD3DCounter(const FD3DCounter &)' : cannot convert parameter 1 from 'int' to 'const FD3DCounter &' 1> Reason: cannot convert from 'int' to 'const FD3DCounter' 1> No constructor could take the source type, or constructor overload resolution was ambiguous 1> d:\\development\src\engine\inc\unstats.h(84) : see reference to function template instantiation 'T InitialStatValue<T>(void)' being compiled 1> with 1> [ 1> T=FD3DCounter 1> ] 1> d:\\development\src\engine\inc\unstats.h(82) : while compiling class template member function 'FStat<T>::FStat(FStatGroup *,const TCHAR *,UBOOL)' 1> with 1> [ 1> T=FD3DCounter 1> ] 1> d:\development\src\d3ddrv\src\d3dstats.h(41) : see reference to class template instantiation 'FStat<T>' being compiled 1> with 1> [ 1> T=FD3DCounter 1> ] 1>Build log was saved at "file://d:\\Development\Intermediate\Debug\D3DDrv\BuildLog.htm" 1>D3DDrv - 1 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Virhe sanoo, että yrität antaa funktiolle parametriksi kokonaislukua, vaikka pitäisi antaa 'const FD3DCounter&'.
Ok no nyt se viskaa tälläsen errorin vielä
1>------ Build started: Project: D3DDrv, Configuration: Debug Win32 ------
1>Compiling...
1>D3DDrv.cpp
1>d:\development\src\engine\inc\unstats.h(70) : error C2143: syntax error : missing ',' before '&'
1>Build log was saved at "file://d:\Development\Intermediate\Debug\
1>D3DDrv - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
mikit88 kirjoitti:
1>d:\development\src\engine\inc\unstats.h(70) : error C2143: syntax error : missing ',' before '&'
Tuossahan tuo lukee mikä voisi olla vikana. unstats.h, rivi 70, syntaksivirhe, puuttuu ',' ennen &-merkkiä, noin suoraan käännettynä. Aloita virheen etsiskely sieltä?
Ehkä muiden kristallipallot osaavat sanoa enemmän?
no joo kokeilin kyllä sitä mut sitten heittää useempia virheitä :O älkää vielä hermoja menettäkö en oo vielä guru :D
Kun joku mainitsee kristallipallon, kyse on usein siitä, että pitäisi olla selvännäkijä kertoakseen ratkaisun. Tässätapauksessa kaivattaisiin tuon rivin 70 koodi ja tietty mieluusti jokunen sen ympärilläkin oleva rivi. Nykykääntäjätkään eivät aina tuota selvimpiä mahdollisia virheilmoituksia.
Jos minun pitäisi arvata, niin kyseisellä rivillä on funktion määrittely ja siinä puuttuu pilkku kahden parametrin määrittelyn välillä.
Gaxx kirjoitti:
Nykykääntäjätkään eivät aina tuota selvimpiä mahdollisia virheilmoituksia.
Tämä ei pidä paikkaansa ainakaan näiden virheilmoitusten kohdalla. Molemmat ovat aivan selkeitä, jälkimmäinen tosin pitää osata lukea laajemmin muodossa "jotain vikaa &-merkin lähistöllä". Tämän virheen kohdalla aloittelijan kuuluu tietenkin ottaa perusopas käteen ja katsoa, miten rivi pitäisi oikeasti kirjoittaa.
C++:n perussyntaksi pitää osata ihan itse selvittää, vasta kaavaimilla päästään niin erikoisiin tilanteisiin, että saa kysyä apua. ;)
Metabolix kirjoitti:
Gaxx kirjoitti:
Nykykääntäjätkään eivät aina tuota selvimpiä mahdollisia virheilmoituksia.
Tämä ei pidä paikkaansa ainakaan näiden virheilmoitusten kohdalla.
En nyt tiedä kannattaisiko tästä ruveta vääntämään kättä, mutta kommentoidaan nyt kumminkin. Pointti oli siinä, että aloittelija ei kokemattomuuttaan osaa tulkita ilmoitusta "puuttuu ',' ennen &-merkkiä" muodossa "jotain vikaa &-merkin lähistöllä". Se nyt on periaatteessa yksi ja sama mitä se kääntäjä suoltaa virheilmoitukseksi, sillä kyllä sitä ajan kuluessa oppii tulkitsemaan niitä oikein. Kokemuksen myötä suurimmassa osassa tapauksista riittää pelkkä suurpiirteinen rivinumero eikä syntaksivirheiden löytäminen tuota vaikeuksia.
Kyllähän ne nykyään minustakin ovat selkeitä, mutta aluksi ne tuntuivat heprealta.
Nykyisinhän alkaa olla editoritkin sellaisia että ne korostavat virheet jo kirjoitusvaiheessa, ja jopa ehdottelevat korjauksia, jotka sitten saa yhdellä hiiren klikkauksella halutessaan.
Esimerkiksi jos VS.Net 2008:ssa (C#) jos ei ole laittanut using System.Text; ja kirjoittaa
var Satu = new StringBuilder("Olipa kerran");
Niin tuohon StringBuilder alle tulee sellainen punainen aaltoviiva ja kun menee hiirellä kohdalle niin keltainen laatikko jossa lukee "The type or namespace name 'StringBuilder' could not be found (are you missing a using directive or assembly reference?)". Jos siihen klikkaa niin tulee sellainen alasvetopainike ohjeella "Options to help bind the selected item (Shift-Alt-F10)" ja sieltä löytyy sitten vaihtoehdot joilla sen saa lisäämään tiedoston alkuun using System.Text; tai muuttamaan StringBuilder tilalle System.Text.StringBuilder
Jos ei tuon tyylisestä tykkää, niin muitakin avustavia editoreita toki löytyy.
Mut siis pointtina mulla kai on suurinpiirtein, että kunnollisilla työkaluilla syntaksin perustarkistus ei jää kääntämisvaiheeseen.
Asiaa sivuten:
Grez kirjoitti:
Nykyisinhän alkaa olla editoritkin sellaisia että ne korostavat virheet jo kirjoitusvaiheessa, ja jopa ehdottelevat korjauksia, jotka sitten saa yhdellä hiiren klikkauksella halutessaan.
Harvinaisen vastenmielinen (isosti, pitää tässäkin avautua ;) ominaisuus (IMO) väärin toteutettuna. Taannoin käytin vieraassa ympäristössä Netbeans IDE:tä C-käytössä, ja tässä oli reaaliaikainen koodinparsinta, joka oli auttamattoman yli-innokas: kenelle oikeasti tarvitsee kertoa, että keskeneräinen rivi on syntaktisesti virheellinen? Korostan valitsemani rivit toisella tavalla, kiitos.
Ilmeisesti ominaisuus on kuitenkin suosittu (ei voi ymmärtää); niinkin, että valikkojen yksinkertaistamiseksi uusimmassa sarjassa ei saanut reaaliaikaista parsintaa viivytettyä tai pois, vaan sen piilottamiseksi piti poistaa myös kääntäjän virheilmoitusten merkkaus. No, eipä ole minun editor-of-choice.
En kyllä oikeasti ymmärrä miten se voi alkaa nuppia kuumottamaan jos riville tulee pari ylimääräistä alleviivausta kun tietää että se on kesken. Kokeilin tuossa kirjoittaa VS:llä ihan höpö höpöjä ja tulihan siihen "työn alla" olevalle riville ne alleviivaukset kun lopetti kirjoittamisen 5 sekunniksi. En sitten tiedä, onko tuossa nuo ominaisuudet "toteutettu oikein", koska ainakaan itseäni ne ei tuossa ole häirinneet. Jossain muussa editorissa kyllä joskus häiritsi.
Ja käsittääkseni nuo saa aika pitkälti rukattua mieleisikseen. Harvinaista kyllä tässä MS-tuotteessa tuntuu minulle toimivan oletuksetkin aika hyvin. Voisin kuvitella että tuossa voisi jollain mennä ennemmin kuppi nurin tuon automaattisen jäsentelyn kanssa.
C++:n editori- ja muu työkalutuki on yleensä heikompi kuin esimerkiksi Javalla tai Cissällä. Johtuu siitä, että C++:n syntaksi on kenkumpi ja tilannetta vaikeutetaan vielä sillä, että käytetään esikäännöskoneistoa täsmällisemmän moduulipaketoinnin sijasta.
Mutta jos mikit88:lle nyt ei oikein näistä puheista ole asia vielä oikein selvinnyt, niin tässä selkokielellä: Hyvä, että kysymyksessäsi annoit tarkat kääntäjän virheilmoitukset. Niistä ei kuitenkaan pysty sanomaan juuri mitään hyödyllistä, koska et ole näyttänyt riviäkään siitä koodista, jossa virhe ilmenee. Todennäköisesti tarvittavia tietoja ovat FD3DCounter-luokan esittely sekä nuo raportoidut rivit ympäristöineen. Noin alkajaisiksi.
Tässäpä olisi muutamia pyydettyjä asioita kertokaa jos lisää tietoa tarvitaan :)
class FD3DCounter { template <class FD3DCounter> friend FD3DCounter InitialStatValue(FD3DCounter()) { return FD3DCounter(); } // Constructor. public: DWORD RenderCycles, WaitCycles, Pixels; FD3DCounter(): RenderCycles(0), WaitCycles(0), Pixels(0) {} };
Ja tässäpä on rivi 70:
template<class T> T InitialStatValue(int FD3DCounter&) { return 0; }
Mod. lisäsi kooditagit ja poisti tajuttomasti tyhjiä rivejä
Vika on ilmiselvästi siinä, ettei rivissä 70 ole erityisemmin järkeä.
Onko itselläsi jokin käsitys (eli harhaluulo), mitä tuo suluissa oleva "int FD3DCounter&
" tarkoittaa? Myöskään templaten käytössä ei ole mitään ideaa, kun palautat kuitenkin nollan.
Kun nyt on kyse vain yhdestä rivistä, ei kannata yrittääkään "korjata" sitä. Ota se pois ja kirjoita tilalle uusi, joka tekee oikean asian.
Metabolix kirjoitti:
Myöskään templaten käytössä ei ole mitään ideaa, kun palautat kuitenkin nollan.
Lainaus Wikipediasta: The programmer may decide to implement a special version of a function (or class) for a certain type which is called template specialization.
Ja tuossa koodissa on ilmeisesti annettu myös tarkempi toteutus initialStatValue
:lle, jossa T
on FD3DCounter
ja palautetaan muuta kuin nolla. En tiedä C++:sta melkein mitään ja ehkä tuossa ei ole mitään järkeä tai se kannattaisi tehdä jollain toisella tavalla, mutta voi olla, että siinä on jotain ideaa.
Kiitos neuvoista...eiköhän tämä tästä....Metabolix en itse tuota 70 riviä ole kirjoittanut. Juuri tuota FD3DCounteria ainoastaan muutin...ja templateista on pakko myöntää ettei ole oikein tiedossa vielä kunnolla ne.
funktio kirjoitti:
Ja tuossa koodissa on ilmeisesti annettu myös tarkempi toteutus
initialStatValue
:lle, jossaT
onFD3DCounter
ja palautetaan muuta kuin nolla.
Vaan kun ei valitettavasti ole. Oli niin merkillinen rivi, etten viitsinyt edelliseen viestiin vielä tuosta kirjoittaa vaan päätin ensin tehdä asiasta hieman perusteellisemman selostuksen.
Katsotaanpa nyt sitä tarkemmin:
template <class FD3DCounter> friend FD3DCounter InitialStatValue(FD3DCounter()) { return FD3DCounter(); }
Koska FD3DCounter on tässä kaavaimen parametrin nimi, sillä ei ole enää mitään tekemistä kyseisen luokan kanssa. Kaavain pysyy siis samana, vaikka parametrin nimeä vaihdettaisiinkin. Kas näin:
template <class T> friend T InitialStatValue(T()) { return T(); }
// Kaavain ottaa parametrinaan tyypin T. template <class T> // Sana friend koskee aina luokkaa, jossa koodi on, joten // kaavailtu funktio on luokan FD3DCounter ystävä. friend // Itse funktio palauttaa T-tyyppisen arvon ja ottaa parametrikseen // T()-tyyppisen arvon. T() on tässä tilanteessa sama kuin T(*)(), // siis osoitin funktioon, joka ei ota parametreja ja palauttaa myös // T-tyyppisen arvon. Tällä parametrilla ei ole lainkaan nimeä, // joten sitä ei voi edes käyttää funktiossa eikä sillä ole merkitystä. T InitialStatValue(T()) { // Funktio palauttaa T-tyyppisen objektin. // Tämä voi olla vaikka int() tai FD3DCounter(). return T(); }
Selostuksen todenperäisyyden voi todeta seuraavassa ohjelmassa. Ohjelma myös näyttää, kuinka noita erikoistoteutuksia oikeasti kirjoitetaan.
#include <iostream> class C { int x, y; public: // Muodostin; C(3) => (3, 3) C(int _i = 0): x(_i), y(_i) {} // Tulostusoperaattori friend std::ostream& operator << (std::ostream& ost, C const& c) { return ost << c.x << ", " << c.y; } // Tutkimamme funktio. T:n paikalla voisi olla myös C, mutta tällöin // C-luokan käyttö funktiosta ei tietenkään onnistuisi, koska nimi // tarkoittaisikin parametrityyppiä. template <class T> friend T f(T()) { // Turhalla C-kikkailulla todetaan, että friend-määre toimii: // c.x ja c.y ovat yksityisiä, käyttöön tarvitaan friend. C c = C(1); c.x = c.y; return T(); } }; // Normaali kaavainfunktio template <typename T> T g() { return 1; } // Erityinen int-toteutus template <> int g() { return 2; } int main() { // Mitä float-tyypin oletusmuodostin palauttaa? std::cout << float() << std::endl; // 0 // Kutsutaan funktiota f tyypille float. // Parametri tarvitaan, koska sellainen on määrittelyssäkin. // Parametriksi kelpaa 0 eli NULL eli "tyhjä" osoitin. // Tätähän ei funktiossa käytetä, joten ei ole väliä. std::cout << f<float>(0) << std::endl; // 0 // Kutsutaan samaista funktiota luokalle C. std::cout << f<C>(0) << std::endl; // 0, 0 // Kutsutaan funktiota g tyypille float. std::cout << g<float>() << std::endl; // 1 // Kutsutaan funktiota g tyypille int, tällehän on oma toteutus. std::cout << g<int>() << std::endl; // 2 // Kutsutaan funktiota g tyypille C. // Muunnos 1 => C(1) tapahtuu kaavaimessa automaattisesti. std::cout << g<C>() << std::endl; // 1, 1 }
Aika mahdotonta antaa kunnollisia korjausehdotuksia, kun tuosta koodista ei tajua, mitä oikeastaan yritetään tehdä.
mikit88 kirjoitti:
1>d:\development\src\engine\inc\unstats.h(70) : error C2143: syntax error : missing ',' before '&'
Ja tässäpä on rivi 70:
template<class T> T InitialStatValue(int FD3DCounter&) { return 0; }
Tarkalleen ottaen virheilmoitus tulee siitä, että tuo int FD3DCounter&
ei mene C++:n sääntöjen mukaan. Siinä on kaksi tyyppimääritystä peräkkäin. Kääntäjä on arvaillut, että siitäpä taitaa puuttua pilkku, jotta määrittelyssä olisikin kaksi parametria. Mutta yhtä hyvin toinen noista voi olla ihan vain ylimääräinen, kun tällä hetkellä kumpaakaan ei ilmeisesti käytetä yhtikäs mihinkään.
Alkuperäinen virheilmoitus liittyy siihen, että jossakin yritetään luultavasti tehdä nollasta FD3DCounter-olio. Ei vain ole määritelty sellaista konstruktoria tms., joka muunnoksen voisi tehdä. Luokan esittelyssä pitäisi siis olla esimerkiksi tällainen konstruktori: FD3DCounter(int n)
.
Aihe on jo aika vanha, joten et voi enää vastata siihen.