2016-07-28 24 views
3

Ich bekomme einen seltsamen Fehler beim Versuch, Vorlage Vererbung zu verwenden. Dies ist mein Code:Vorlage Vererbung und eine Basiselementvariable

template <class T> class A { 
public: 
    int a {2}; 
    A(){}; 
}; 

template <class T> class B : public A<T> { 
    public: 
    B(): A<T>() {}; 
    void test(){ std::cout << "testing... " << a << std::endl; }; 
}; 

Und das ist der Fehler:

error: use of undeclared identifier 'a'; did you mean 'std::uniform_int_distribution<long>::a'? 
    void test(){ std::cout << "testing... " << a << std::endl; } 

Und falls könnte sich dies etwas nutze ich diese Flags:

-Wall -g -std=c++11 

ich nicht wirklich tun wissen, was falsch ist, da der gleiche Code wie reine Klassen ohne Templating funktioniert. Diese

+1

'Leere Test() {std :: cout << "Test ..." << A :: a << std :: endl; }; ' – Rerito

Antwort

4

I really don't know what is wrong since the same code as pure classes without templating works fine.

ist, weil die Basisklasse (class template A) kein nondependent Basisklasse, kann seine Art nicht ohne Kenntnis der Vorlage Argumente bestimmt werden. Und a ist ein nicht abhängiger Name. Nicht abhängige Namen werden nicht in abhängigen Basisklassen nachgeschlagen.

Um den Code zu korrigieren, könnten Sie den Namen a abhängig machen, abhängige Namen können nur zum Zeitpunkt der Instanziierung gesucht werden, zu dieser Zeit muss die genaue Basisspezialisierung erkundet werden und wird bekannt sein.

Sie könnten

void test() { std::cout << "testing... " << this->a << std::endl; }; 

oder

void test() { std::cout << "testing... " << A<T>::a << std::endl; }; 

oder

void test() { 
    using A<T>::a; 
    std::cout << "testing... " << a << std::endl; 
}; 
+0

Danke für die Antwort. Es macht jetzt Sinn :) –