Como posso portar o código msvc ++ com nomes não dependentes em modelos para o Linux?

5

Eu posso lidar com as funções dependentes da plataforma de portabilidade. Eu tenho um problema que os compiladores que eu tentei no Linux (clang e g + +) não aceitam o código a seguir, enquanto o compilador msvc + + faz:

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;
}

erro g ++:

main.cpp: In member function ‘void Derived<T>::setValue(const T&)’:
main.cpp:11:3: error: ‘Value’ was not declared in this scope

Eu acredito nisso devido ao uso de um nome não dependente ( Value ) na segunda classe. Mais informações .

O problema é que tenho uma base de código muito grande, na qual esse tipo de código é usado com muita frequência. Eu entendo que é errado quando se olha para o padrão. No entanto, é muito conveniente não ter que escrever this-> ou Base<T>:: antes de cada uso de Value . Mesmo escrevendo using Base<T>::Value; no início da classe derivada é problemático quando você usa ~ 20 membros da classe base.

Então, minha pergunta é: existem compiladores para Linux que permitem esse tipo de código (com ou sem opções extras de compilador)? Ou existem modificações pequenas que permitirão que este código seja compilado no Linux?

    
por user352382 30.10.2012 / 14:45
fonte

1 resposta

0

Também postei essa pergunta em SO . Dos poucos comentários aqui e das respostas lá chego à mesma conclusão: tenho que consertar meu código. Adicionando minha própria resposta para marcar essa pergunta como aceita / resolvida.

    
por 31.10.2012 / 16:45
fonte

Tags