Erros, bugs, perguntas - página 2006

 
fxsaber:

Porque deveriam ambos compilar?

Em geral, uso raramente modelos - não entrei em detalhes - só posso explicar a um nível intuitivo

No 2º caso, uma substituição directa de T por A* compila bem - por isso o modelo também deve compilar

class A {};
void f( A * const ) {}
void OnStart()
{
        A *a;
        f( a ); //нормально
}

No primeiro caso, uma substituição directa não funciona, mas pode adicionar o parâmetro redundante T2 - com ele compila normalmente - pelo que deve fazê-lo sem ele - pois este é redundante

template<typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart()
{
        const A *a;
        f( a, a ); //нормально
}
 
A100:

Intuitivamente, const é por vezes parte de um tipo e por vezes apenas um identificador, que dentro da função o ponteiro será const.

Isto pode ser sentido através dePrint(__FUNCSIG__);

 
O valor de drawdown na tabela de optimização é exibido de forma estranha. Mostra o máximo de levantamento por meios (mas é escrito como percentagem). Mas depois de um único teste, verifica-se que o drawdown relativo difere do máximo (a percentagem é maior ou menor). Ao utilizar a gestão de dinheiro, é necessário acrescentar algo para mostrar os resultados requeridos?
 
A100:

Erro de compilação

template<typename T>
void f( T, const T ) {}
class A {};
void OnStart()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
É assim que se compila, a versão original não deve.
 
Комбинатор:
É assim que se compila, a versão original não deve.

Porquê?

template<typename T>
struct B {
        void f( T, const T ) {}
};
class A {};
void OnStart()
{
          const A* a;
        B<const A*> b;
        b.f( a, a ); //нормально
}

Portanto, está bem. O que mudou em princípio?

template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100:

O que mudou fundamentalmente?

A diferença é enorme! Foi o que chamou.

void B<const A*>::f(const A*,const A*)
Os erros do compilador no sentido de que não consegue descobrir a versão correcta do modelo. Obviamente que o disse para o fazer.
template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f<const A*>( a, a );
}

E está a funcionar.

 
fxsaber:
E está a funcionar.

Porquê os caracteres extra?

 
A100:

Porquê os caracteres extra?

Para mostrar que o compilador não adivinha uma versão perfeitamente funcional do padrão.

 
fxsaber:

Para mostrar que o compilador não adivinha uma versão perfeitamente funcional do padrão.

Porque deveria? ServiceDesk pode descobri-lo por si só

 
A100:

Porquê?

A julgar pela sua especialização, o tipo deve ter sido constantemente descartado, o que faz. Se especificar explicitamente o tipo correcto, é claro que compilará.