Portál AbcLinuxu, 10. května 2025 08:57

Dotaz: Dědění od std::vector

31.3.2011 22:04 qiRzT | skóre: 14 | blog: U_Marvina
Dědění od std::vector
Přečteno: 322×
Odpovědět | Admin
Zdravím, na mnoha místech na webu jsem našel, že to není dobrý nápad, ale vzhledem k tomu, že to potřebuju jen proto, abych prozkoumal, jak se chová jedna knihovna, tak mi nějakí ta prasárna nevadí. Zkoušel jsem následující:
template <class T> class mvect : public std::vector<T>
{
 public:
  const std::vector<T>::const_iterator begin() const
  {
   return std::vector<T>::begin();
  }
};
Není mi jasné, proč se od překladače dozvím, že:
vect.h:23: error: ISO C++ forbids declaration of 'const_iterator' with no type
vect.h:23: error: expected ';' before 'begin'
vect.h:29: error: expected `;' before '}' token
const_iterator je přeci součást vectoru, ne?

Uměl by mi to, prosím, někdo vysvětlit?

Díky.
Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 31.3.2011 22:23 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Dědění od std::vector
Odpovědět | | Sbalit | Link | Blokovat | Admin
Aniž bych si myslel, že je to ten problém, tak ten první const je tam navíc. const_iterator je sám o sobě konstantní.
1.4.2011 13:10 Jirka P
Rozbalit Rozbalit vše Re: Dědění od std::vector
To je nesmysl. Mezi "ptr to const" (aka const_iterator) a "const ptr to const" je rozdíl (ačkoli nechci předjímat, který z významů měl básník na mysli).
1.4.2011 13:28 Sten
Rozbalit Rozbalit vše Re: Dědění od std::vector
const_iterator je třída a zde se předává hodnotou (tj. jako rvalue), takže to const tam je skutečně zbytečné. Když zapnete „-Wextra“, tak vás na to GCC upozorní.
1.4.2011 13:52 Jirka P
Rozbalit Rozbalit vše Re: Dědění od std::vector
Jestli je tam const potřebné si netroufám tvrdit, sám nejsem zastáncem návratových typů s const, ale existují lidé, kteří je propagují a mají pro to své důvody. Každopádně má vliv na okolní program, takže zbytečné tam asi nebude. Dalo by se to formulovat jako hádanka (najděte dva programy, které se liší jen const-kvalifikací návratového typu jedné funkce a dávají různé výsledky, příp. jen jeden lze přeložit), ale to by bylo moc lehké.
1.4.2011 14:36 Sten
Rozbalit Rozbalit vše Re: Dědění od std::vector
U referencí a pointerů má const smysl, protože předáváte lvalue (u pointerů pouze pro cílový typ, samotný poitner je rvalue), u předání hodnotou (rvalue; to je i ten const_iterator) ne. Tolik ISO standard. Klidně si to můžete vyzkoušet, že následující příklad vypíše stejnou chybu u getTest i getTestConst (volání protected konstruktoru), i když by podle vás měl první projít:
class Test
{
public:
    Test()
    {}

    Test(Test&)
    {}

protected:
    Test(const Test&);
}


Test getTest()
{
    return Test();
}


const Test getTestConst()
{
    return Test();
}


void test()
{
    Test t(getTest());
    Test t2(getTestConst());
}
Mimochodem C++2011 má taky rvalue jenom bez const (Test&&).
1.4.2011 15:01 Jirka P
Rozbalit Rozbalit vše Re: Dědění od std::vector
Ten váš příklad nedokazuje nic jiného, než že rvalue nelze použít tam, kde je očekávána lvalue, o const to neříká nic.

Jinak pokud se oháníte ISO standardem, měl byste připojit citaci, kde konkrétně zapovídá const u rvalue, případně kde vůbec mluví o smyslu čehosi. Dále si laskavě vyřešte hádanku a nevkládejte jiným do úst, co neřekli.
Řešení 1× (qiRzT (tazatel))
31.3.2011 22:51 Sten
Rozbalit Rozbalit vše Re: Dědění od std::vector
Odpovědět | | Sbalit | Link | Blokovat | Admin
Prasárna to není, akorát tam potom chybně funguje použití předka místo potomka (včetně nevolání destruktoru potomka), takže na to musíte dávat pozor a řekl bych, že pro váš účel to fungovat nebude :-)

Jinak vám tam chybí typename, protože jde o typ definovaný v šabloně:
const typename std::vector<T>::const_iterator begin() const
1.4.2011 09:39 qiRzT | skóre: 14 | blog: U_Marvina
Rozbalit Rozbalit vše Re: Dědění od std::vector
Díky :-) Pro můj účel to funguje, dělá to přesně to, co jsem chtěl - tj. můžu snadno sledovat, kdy se ta metoda volá.
Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.