2016-03-26 10 views
-1

Ich erstelle Containervorlagen für verschiedene Typen. Ein Typ ist shared_ptr für das Objekt. Also um doppelten Code für Operanden zu vermeiden -> und. zum Aufrufen von Objektmethoden. Ich versuche, Teil-Vorlage spetialization zu tun, aber ich habe diesen Fehler:Template Klassenspezialisierung - "Operation 'wurde in diesem Bereich nicht deklariert."

error: variable or field 'doOperation' declared void void MepVector<unique_ptr<T>, U>::doOperation(Operation operation) error: 'Operation' was not declared in this scope

Code:

template <typename T, typename U> 
class MepVector 
{ 
private: 
    typedef void(U::*Operation)(); 
public: 
    MepVector() {} 

    void doOperation(Operation operation); 


    void add(T t) 
    { mepVector_.push_back(t); } 

    void show() 
    { doOperation(&U::show); } 


private: 
    std::vector<T> mepVector_; 
}; 

template <typename T, typename U> 
void MepVector<unique_ptr<T>, U>::doOperation(Operation operation) 
{ 
    for(auto& t : mepVector_) 
    { 
     (t->*operation)(); 
    } 
} 

template <typename T, typename U> 
void MepVector<T, U>::doOperation(Operation operation) 
{ 
     for(auto& t : mepVector_) 
     { 
      (t.*operation)(); 
     } 
} 

class A 
{ 
    public: 
    A() {}; 
    void show() 
    { cout<<"udalo sie!"<<endl; } 
}; 

int main() { 
    MepVector<A,A> myVector; 

    myVector.add(A()); 

    myVector.show(); 

    return 0; 
} 

Antwort

-1

Verwenden "typedef void (U::*Operation)()" statt "typedef void (U::*Operation)()" .. das ist Platz sein sollte ...

+0

Operation ist ein typedef Zeiger – user3191398

+0

ohh ja, aber Sie haben diesen Zeiger im privaten Modus deklariert .. aber es sollte im öffentlichen Modus sein .. – Shiv

+0

hat es nicht geholfen – user3191398

0

Sicherlich in Ihrer Klasse Spezialisierung MepVector<unique_ptr<T>, U> haben Sie vergessen, die Operation typedef zu definieren.

Verwandte Themen