Problem mit Template Funktion



  • Hi!
    Ich habe ein Problem mit Template Funktionen in einer Klasse ... Habe noch kaum mit templates gearbeitet und versteh den Fehler nicht. Wenn ich die Funktionen nicht in der Klasse definiere dann funktioniert der Code. Schon mal vielen Dank,

    Max

    template<typename Type, unsigned int Cellsize>
    class Data
    {
    ...
    };
    class Writer
    {
    	...
    	template< typename T >
    	std::string TypeDescription() 
    	{ ... };
    	template<>
    	std::string TypeDescription<double>()
    	{
    		return std::string("double");
    	};
    
    	template< typename Type, unsigned int Cellsize >
    	inline void WriteField( const Data<Type,Cellsize> &d)
    	{
    		cout<<TypeDescription<Type>();
    	};
    };
    
    int main()
    {
    	Data<double,1> test;
    	Writer write;
    	write.WriteField(test);
    	return 0;
    }
    


  • max1234 schrieb:

    versteh den Fehler nicht.

    Welchen?



  • error C2275: "Type" : Ungültige Verwendung dieses Typs als Ausdruck 
    Siehe Deklaration von 'Type' 
    Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __thiscall Writer::WriteField(const class Data &)' 
    
    error C2059: Syntaxfehler : ')' 
    Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __thiscall Writer::WriteField(const class Data &)'
    
    Fehler beim Ausführen von cl.exe.
    

  • Mod

    Explizite Spezialisierungen von Membertemplates müssen im Namensraum, der die jeweilige Klasse umgibt deklariert werden, nicht in der Klasse selbst.



  • Danke. Aber ich mach immer noch irgendwas falsch. Jetzt bekomme ich den Fehler
    fatal error C1001: INTERNER COMPILER- FEHLER 😕

    namespace temp {
    template<typename Type, unsigned int Cellsize> 
    class Data 
    { 
    ... 
    }; 
    class Writer 
    { 
        ... 
        template< typename T > 
        std::string TypeDescription() 
        { ... }; 
    
        template< typename Type, unsigned int Cellsize > 
        inline void WriteField( const Data<Type,Cellsize> &d) 
        { 
            cout<<TypeDescription<Type>(); 
        }; 
    }; 
    
    template<> 
        std::string Writer::TypeDescription<double>() 
        { 
            return std::string("double"); 
        };
    
    } //namespace temp
    
    int main() 
    { 
        temp::Data<double,1> test; 
        temp::Writer write; 
        write.WriteField(test); 
        return 0; 
    }
    

  • Mod

    Zeig den Code mal exakt so wie du den Compiler fütterst. Welcher Compiler wird eingesetzt?
    Hinter geschweifte Klammern, die Funktionsdefinitionen abschließen, gehört kein Komma.



  • Ich benutze VC++6.0

    Das war schon fast der ganze code...

    typedef double Real;
    
    using namespace std;
    
    namespace test{
    template<typename Type, unsigned int Cellsize>
    class Data
    {
    };
    
    class Writer
    {
    	public:
    		Writer();
    		~Writer();
    		template< typename Type >
    			std::string TypeDescription() 
    		{
    			cout<<("Error in Writer::TypeDescription(): Unknown Datatype ");
    			return (" ");
    		}
    
    		template< typename Type, unsigned int Cellsize >
    			inline void WriteField(	const Data<Type,Cellsize> &d)
    		{
    			cout<<TypeDescription<Type>(); 
    		}
    	private:
    };
    
    template<>
    std::string Writer::TypeDescription<Real>()
    {
    	return std::string("double");
    }
    }
    
    int main()
    {
    	test::Data<Real,1> hallo;
    	test::Writer write;
    	write.WriteField(hallo);
    	return 0;
    }
    


  • Max1234 schrieb:

    Ich benutze VC++6.0

    Das wird der Grund sein. Ich empfehle ein Update auf die neueste Version, VC6 ist einfach zu fehlerhaft.



  • Konrad Rudolph schrieb:

    Max1234 schrieb:

    Ich benutze VC++6.0

    Das wird der Grund sein. Ich empfehle ein Update auf die neueste Version, VC6 ist einfach zu fehlerhaft.

    Genau, würde ich auch empfehlen. VC++08 funktioniert es. Afaik haben älteren Compiler ja noch Probleme mit Templates/ Spezialisierung.



  • .. da hätt ich lange suchen können 😉 Jetz gehts...

    Danke nochmal!!


Anmelden zum Antworten