2017-11-17 5 views
0

Dies ist in Fortsetzung mit der gebuchten Frage an Template type deduction for member variables and function argumentsVorlagentyp Abzug in Funktion Rückgabetyp

Meine .h-Datei der folgenden Zeilen enthält.

#include <iostream> 
#include <complex> 
#include <typeinfo> 


template <typename T> 
class MyClass 
{ 


template <typename T0> 
struct myTypeTraits 
{ using type = T0; }; 

template <typename T0> 
struct myTypeTraits<std::complex<T0>> 
{ using type = T0; }; 


public: 

    using T0 = typename myTypeTraits<T>::type; 

    void setVar1(const T0& v); 

    void setVar2(const T& v); 

T0 getVar1() const; 
T getVar2() const; 




    void print() const; 

    T0 var1; 
    T var2; 
}; 

Die CPP-Datei enthält die folgenden Codes.

#include "tmp.h" 
template <class T> 
void MyClass<T>::setVar1(const T0& v) 
{ 
    var1 = v; 
} 


template <class T> 
void MyClass<T>::setVar2(const T& v) 
{ 
    var2 = v; 
} 


template <class T> 
T0 MyClass<T>::getVar1() const 
{ 
    return var1; 
} 


template <class T> 
T MyClass<T>::getVar2() const 
{ 
    return var2; 
} 


template <typename T> 
void MyClass<T>::print() const 
{ 
    std::cout<<"var1: "<<var1<<std::endl; 
    std::cout<<"var2: "<<var2<<std::endl; 

} 



int main() 
{ 

    MyClass<float> tmp; 

    MyClass<std::complex<float> > tmp1; 

    tmp.print(); 
    tmp1.print(); 
    return 0; 
} 

Jetzt, wenn ich den Code mit C++ 11 Unterstützung in g ++ kompilieren, bekomme ich den folgenden Fehler.

tmp.cpp:17:1: error: ‘T0’ does not name a type 
T0 MyClass<T>::getVar1() const 
^ 

Wie kann ich den Fehler entfernen?

+0

* "Die CPP-Datei hat die folgenden Codes. "*: -> Siehe [Warum-kann-Vorlagen-nur-implementiert-in-der-Header-Datei] (https://stackoverflow.com/questions/495021/why-can-templates- only-in-the-header-file implementiert) – Jarod42

Antwort

3

Der Compiler kann nicht wissen, dass T0 in MyClass<T> definiert ist. Sie müssen also richtig die Reutrn Typ qualifizieren:

template <class T> 
typename MyClass<T>::T0 MyClass<T>::getVar1() const { 
    return var1; 
} 

Alternativ können Sie auch eine Hinterrückgabetyp verwenden, die Sie nicht brauchen, zu qualifizieren entweder:

template <class T> 
auto MyClass<T>::getVar1() const -> T0 { 
    return var1; 
} 
1

mit

// ......................vvvvvvvvvvvvvvvvvvvvvvv 
void MyClass<T>::setVar1(typename MyClass<T>::T0 const & v) 
{ 
    var1 = v; 
} 

Versuchen und das gleiche für getVar1()

+1

Während dies natürlich erlaubt ist, ist dies nicht zwingend notwendig für 'setVar1', da der Compiler zu diesem Zeitpunkt' T0' in 'MyClass ' definiert finden kann. – Darhuuk