Posso occuparmi del porting delle funzioni dipendenti dalla piattaforma. Ho un problema che i compilatori che ho provato su Linux (clang e g ++) non accettano il seguente codice, mentre il compilatore msvc ++ fa:
template <class T>
class Base {
protected:
T Value;
};
template <class T>
class Derived : public Base<T> {
public:
void setValue(const T& inValue){
Value = inValue;
}
};
int main(int argc, char const *argv[])
{
Derived<int> tmp;
tmp.setValue(0);
return 0;
}
Errore g ++:
main.cpp: In member function ‘void Derived<T>::setValue(const T&)’:
main.cpp:11:3: error: ‘Value’ was not declared in this scope
Credo che ciò sia dovuto all'uso di un nome non dipendente ( Value
) nella seconda classe. Ulteriori informazioni .
Il problema è che ho una base di codice molto grande, in cui questo tipo di codice viene usato molto spesso. Capisco che è sbagliato quando si guarda lo standard. Tuttavia è molto conveniente non dover scrivere this->
o Base<T>::
di fronte a ogni utilizzo di Value
. Anche scrivere using Base<T>::Value;
all'inizio della classe derivata è problematico quando si usano ~ 20 membri della classe base.
Quindi la mia domanda è: ci sono compilatori per Linux che consentono questo tipo di codice (con o senza opzioni aggiuntive per il compilatore)? O ci sono piccole modifiche che permetteranno a questo codice di compilare su Linux?