Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Member template Spezialisierung mit anderem Template

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.06.2005, 10:33 Uhr
Th



Ich habe ein Member-Template und möchte es gerne allgemein für das Template std::basic_string<C, T, A> spezialisieren, also in etwa


C++:
class X
{

protected:
    template<typename T>
    const void * readBuf( void *_pObj) const
    {
        return (*m_FunGet)(_pObj);
    }

    template<>
    template<typename TChar, typename TTraits, typename TAllocator>
    const void * readBuf< std::basic_string<TChar, TTraits, TAllocator> >( void *_pObj) const
    {
        return ((const std::basic_string<TChar, TTraits, TAllocator> *)((*m_FunGet)(_pObj)))->c_str();
    }

private:
    CFuncBase * m_FunGet;
}



Bisher habe ich explizite Spezialisierungen für std::string, std::wstring etc.
Jedoch wäre es schöner, wenn der Compiler mir die Arbeit abnehmen würde.
Obiges liefert mir beim VC7.1 (VS.NET 2003) jedoch die Fehler:

d:\A2dLib V3\Sources\PropertySystem\PropertyHelper.h(190): error C2768: 'NProperty::CMemFunAccessor<TObject,TType>::readBuf' : illegal use of explicit template arguments
d:\A2dLib V3\Sources\PropertySystem\PropertyHelper.h(188): error C3856: 'NProperty::CMemFunAccessor<TObject,TType>::readBuf': class is not a class template

Frage: Erlaubt der C++ Standard die Spezialisierung von Templates und wie sieht der Code dann dafür aus?

Dieser Post wurde am 20.06.2005 um 10:36 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.06.2005, 11:40 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, generell erlaubt der Standard die Spezialisierung von Templates, weite Teile der STL würden sonst garnicht richtig funktionieren. Ich würde so in die richtung gehen:

C++:
#include <string>
#include <iostream>

class X {
public:
        template<typename T>
        static void demo(const T& a) {
                std::cout<<"Common"<<std::endl;
        }

        template<typename C>
        static void demo(const std::basic_string<C, std::char_traits<C>, std::allocator<C> >& a) {
                std::cout<<"String: "<<a<<std::endl;
        }
};


int main() {
        std::string foo("bar");
        X::demo(4711);
        X::demo(foo);
}



Wermutstropfen ist halt, daß Du nicht die Char-traits bzw. Allocatoren frei definieren kannst, aber das ist in 99% der Fälle auch nicht notwendig.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.06.2005, 12:28 Uhr
Th



Danke Virtual,
ich hatte wohl einen Denkfehler, da ich versucht habe anhand des Rückgabewertes zu spezialisieren und nicht anhand des übergebenen Parameters (der bei meiner Funktion immer gleich ist). Dies geht leider nicht, so daß ich es bei meiner expliziten Spezialisierung von "string" und "wstring" lasse (weitere gängige Typen von std::basic_string<> werden sowieso nicht verwendet).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: