Erros, bugs, perguntas - página 1569

 
Ruslan Khasanov:
Porque é que o "lixo" aparece quando se usa um modelador?
E porque é que o utiliza? ))
 

Erro de compilação (construir 1327)

class A { 
public:
        bool operator++( int ) { return false; }
};

void OnStart()
{
        A a;
        while ( a++ ); //'++' - illegal operation use
}
 

Erro de compilação

class A { public:
template<typename T>        void f( T t );
template<typename T> static void g( T t );
}; 
template<typename T> void A::f( T t ) {}
template<typename T> void A::g( T t ) {}

void OnStart()
{
        A a;
        a.f(  1 ); //нормально
        A::g( 1 ); //'g<int>' - access to non-static member or function
}
 

Erro de compilação

class A { public:
        A *operator ++()      { return &this; }
};
template<typename T> void f( T t ) {}
void g( A *a )
{
        f( ++a ); //'A' - declaration without type (1)
        f( a.operator++()); //нормально            (2)
}
Nota especial - se trocar(!) linhas (1) e (2) está bem, o que requer verificação adicional
 
A100:

Erro de compilação

Gostaria de notar especialmente que se você trocar(!) linhas (1) e (2), tudo está bem, o que requer verificação adicional
Compreendo correctamente que f(++a) e f(a+++) causam diferentes variantes de f no vosso exemplo?
 
Anton Zverev:
Compreendo correctamente que f(++a) e f(a+++) causam diferentes variantes de f na vossa amostra?

Não, isto é um erro de compilação - ou seja, ainda não chegou à execução (chamadas específicas). As cordas (1) e (2) são equivalentes do ponto de vista do código (escrita diferente da mesma coisa)

Aqui está outra amostra para que eu não fique com a impressão de que se trata apenas do operador ++

class A { public:
        A *operator <<( int )      { return &this; }
};
template<typename T> void f( T* t ) {}
void g( A* a )
{
        f( a << 1 ); //'A' - declaration without type
}
 
A100:

As linhas (1) e (2) são equivalentes em termos de código (escrita diferente da mesma coisa)

++a e a+++ são no entanto diferentes no seu significado. Não acha?
 
Anton Zverev:
++a e a+++ são, afinal de contas, diferentes no significado. Não acha?
não há a+++
 

Erro de compilação: erro de optimização da árvore

#property library

class A { public:
template<typename T> int f( T a, int b, bool c = false );
};
template<typename T>
int A::f( T a, int b, bool c ) { return 0; }

class B : public A {
        virtual void g();
};
void B::g()
{
        f( 0, 0, false ); //нормально
        f( 0, 0 );        //tree optimization error
}

class C {};
void start( C* ) export {}

Como'erro de optimização em árvore' não é fácil de localizar, peço aos programadores (se tiverem essa possibilidade) que coloquem toda a optimização na chave de optimização (graças a Deus que ela existe), caso contrário, mesmo com programas de trabalho de optimização deficientes acabam por ser totalmente desactivados após a actualização da construção (e é impossível voltar atrás).

Note que todos os erros hoje não são antigos, mas novos - antes (construir 1241) tudo funcionava
 
A100:
não há a+++

Certo. Foi por isso que o tornei mais específico.

Anton Zverev:
Compreendo correctamente que f(++a) e f(a+++) causam diferentes variantes de f no vosso exemplo?