#3 TheOndrap
No pokud to má zjistit ze zdrojáku, tak platí, že program je napsaný v jazyce X tehdy, pokud lze přeložit překladačem (nebo spustit interpreterem) jazyka X. Samozřejmě je tu problém, že některý zdroják lze přeložit jenom s určitými parametry.
Příspěvky odeslané z IP adresy 85.207.23.–
Funkce void Zpracuj() nebere žádný parametr a nic nevrací. Takže jí nic nemůžeš předávat.
Zpracuj() << cokoliv
je pak nesmysl, protože pro typ void (což je návratový typ funkce Zpracuj()) není definován operátor <<. A definovat ani nejde, protože by se to muselo napsat jako
void operator<<(void, const char* txt)
{
}
A to je nesmysl.
To, co je levým operandem operátoru << musí být třída nebo nějaký enum.
#3 Koudis
Pořád si ještě můžeš udělat vlastní třídu zděděnou ze std::shared_ptr. Jenom znovu opíšeš konstruktory a přidáš ten operátor přetypování.
template<typename T>
class my_shared_ptr: public std::shared_ptr<T>
{
typedef
std::shared_ptr<T> Base;
public:
explicit my_shared_ptr(T* ptr): Base(ptr) { }
operator T*()
{
return Base::get();
}
operator const T*() const
{
return Base::get();
}
};
Ale je třeba si uvědomit nebezpečí, která jsem zmínil v předešlé odpovědi.
#3 Koudis
Jestli jde jenom o to, aby se ten shared_ptr dal předávat jako parametr funkcím, které požadují obyčejný ukazatel, tak tam musíš strčit ten get. Pokud se totiž začnou mixovat "chytré" ukazatele s obyčejnými, tak je potřeba to dělat s rozmyslem a člověk musí vědět přesně, co se uvnitř té funkce děje. Ta funkce může na ten (obyčejný) ukazatel zavolat třeba delete nebo z něj může udělat další instanci chytrého ukazatele. To obvykle rozbije celý mechanismus reference countingu a program nakonec začne padat - obvykle na naprosto nečekaném místě.
Jak píšeš, je logické, že tento operátor tam není.
Přetypování? Myslíš metodu, která vrátí obyčejný ukazatel? Ta se jmenuje get(). Pokud myslíš něco jiného, tak to rozveď.
- Členská funkce a metoda je totéž
- Pokud se jedná o statickou metodu (členskou funkci), je to totéž, jako obyčejná funkce. Jediný rozdíl může být viditelnost (pokud je private nebo protected, tak nejde přímo volat zvenku té třídy
- Pokud to není statická metoda, tak ji nelze volat bez instance příslušné třídy (obyčejnou funkci nebo statickou metodu lze)
- S bodem 3 silně souvisí i rozdílnost ukazatele na funkci a ukazatele na (nestatickou) metodu.
Předpokládám, že chceš, aby funkce sort seřadila pole řetězců. Ale předáváš jí jenom jeden řetězec (bere typ char*). text[i] je v ní pak jenom jeden znak.
#1 Cpp_Amater
KIIV už tu chybu vypíchl.
Jinak (mimo dotaz) - proč vůbec pořád dokola kopíruješ ten řetězec? První kopie se udělá při volání funkce StringToInt. Ta je sice obvykle rychlá, protože se obvykle jenom inkrementuje reference counter, ale i tak je zbytečná. Stačila by zde reference na konstantní string.
Dále: pak ten řetězec překopíruješ do extra alokovaného bufferu c. Proč? Vždyť totéž se dá číst i přímo z s předaného jako parametr funkci. Mimochodem - toto je typická konstrukce ortodoxních zastánců názoru, že implementace s klasickým céčkovým stringem je vždy rychlejší než std::string.
A na závěr bych zvážil použití konstrukce switch místo série if ... else if ... Výsledná binárka asi bude úplně stejná, ale subjektivně si myslím, že je ten program mnohem čitelnější, protože se mi někde uprostřed switche nemůže schovat žádná odlišná podmínka.
Jak už psali někteří přede mnou, z pohledu licence na Visual Studio Express je to v pořádku.
Jenom záleží, jestli neporušíš vnitřní předpisy firmy, které patří ten počítač. To už je v každé firmě jinak. Někde si můžeš nainstalovat skoro cokoliv, někde free software a někde nic.
#3 Jana24
Tak to hlásí asi z toho důvodu, že definice metody je v headeru, který se inkluduje do více souborů. Takže ta definice pak existuje vlastně vícekrát a překladači (nebo spíš linkeru) je už jedno, že je stejná.
Takže buď ji (tu definici metody) přesuň do nějakého cc souboru (nebo cpp, C, cxx - podle toho, co používáš) nebo pokud ji potřebuješ v headeru, tak před ni připiš inline.
To David10101 : Provede se to v tomto pořadí:
obcan = ((volba=='a') ? true : false)
A udělá to tedy to samé jakoobcan = volba=='a'
Nainstaluj si codeblocks (z www.codeblocks.org), jak už tu někdo výše doporučoval. DevCpp je poměrně zastaralé a asi ne moc udržované.
Naš si psát quicksort, když už ho napsal někdo jiný:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Clovek
{
const char* jmeno;
const char* prijmeni;
};
struct Clovek Lidi[] =
{
{ "Karel", "Lopuch" },
{ "Alois", "Abecedni" },
{ "Franta", "Jetel" }
};
int PorovnejLidi(const void* c1, const void* c2)
{
const struct Clovek* cl1 = (const struct Clovek*)c1;
const struct Clovek* cl2 = (const struct Clovek*)c2;
return strcmp(cl1->prijmeni, cl2->prijmeni);
}
void Vypis()
{
size_t i;
for (i = 0; i < sizeof(Lidi) / sizeof(Lidi[0]); ++i)
{
printf("%s %s\n", Lidi[i].jmeno, Lidi[i].prijmeni);
}
printf("\n");
}
int main()
{
Vypis();
qsort(Lidi, sizeof(Lidi) / sizeof(Lidi[0]), sizeof(struct Clovek), PorovnejLidi);
Vypis();
return 0;
}
Záleží na tom, jak máte deklarovanou obecnou šablonu. Pokud to je
template<typename T>
const T& maxn(const T pole[], size_t delka);
tak specializace jetemplate<>
const char* const& maxn(const char* const pole[], size_t delka);
. Pokud to je template<typename T>
T maxn(const T pole[], size_t delka);
tak specializace je pak template<>
const char* maxn(const char* const pole[], size_t delka);
Pro praxi je jednodušší vyrobit netemplatovanou verzi funkce s konkrétními parametry a překladač jí dá přednost. Ale jako procvičení zhruba tak, jak jsem uvedl.To Sergei : No pokud linker napsal tuto hlášku, tak nejspíš nenašel zmiňovanou knihovnu. Takže chybělo jenom přidat ji do cest, kde má linker knihovny hledat. I když s VS nepracuji, tak to tam určitě jde.
Předpokládám, že se jedná o windows (podle kódové stránky). Je dobré si uvědomit, že konzole nepoužívá kódování Cp1250, al 852 (nebo tak nějak).
To nikto : Ano, máte pravdu. Asi jsem to pořádně nedočetl do konce. Pak souhlasím s tím, že to vypadá na bug v překladači.
To kterosuom : Pokud mám iterátor na nějaký prvek, tak iterátor na předešlý je (iter - 1).