Domanda Risolto Ereditare le funzioni di una classe metaprogrammata

DanyDollaro

Utente Electrum
14 Luglio 2018
148
41
58
138
Ultima modifica:
Salve, mentre tentavo di affinare le mie abilità creando un costrutto di classi meta-programmate assieme ai concetti di ereditarietà mi sono imbattuto in questa stranezza (è una versione semplificata di ciò che sto cercando di fare):
C++:
#include <iostream>

template<class T>
class BASE
{
public:
    void func()
    {
        std::cout << "Hello world";
    }

};

template<class T>
class DERIVED : public BASE<T>
{
public:

    void func2()
    {
        func(); // <-- 'func': identificatore non trovato
    }
};

int main()
{
    DERIVED<int> obj;
    obj.func2();
}
Come potete intuire dal commento, la funzione func(); inclusa nell'ambito di func2(); non viene riconosciuta, mentre nel caso di una classe non meta-programmata il codice verrebbe compilato senza errori:
C++:
#include <iostream>

class BASE
{
public:
    void func()
    {
        std::cout << "Hello world";
    }

};

class DERIVED : public BASE
{
public:

    void func2()
    {
        func();
    }
};

int main()
{
    DERIVED obj;
    obj.func2();
}
Ho anche provato a rendere func2(); una virtualizzazione di func();, ma la chiamata di funzione func(); da origine ad un buffer overflow.
C++:
#include <iostream>

template<class T>
class BASE
{
public:
    virtual void func()
    {
        std::cout << "Hello world";
    }

};

template<class T>
class DERIVED : public BASE<T>
{
public:

    void func() override
    { // Buffer overflow
        func();
    }
};

int main()
{
    DERIVED<int> obj;
    obj.func();
}
Quindi mi chiedo, com'è possibile fare una cosa del genere :wtf:?