class A { public:
template<typename T> void f( T t );
template<typename T> staticvoid g( T t );
};
template<typename T> void A::f( T t ) {}
template<typename T> void A::g( T t ) {}
voidOnStart()
{
A a;
a.f( 1 ); //нормально
A::g( 1 ); //'g<int>' - access to non-static member or function
}
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: si se intercambian las líneas (1) y (2) no pasa nada, lo que requiere una comprobación adicional
Anton Zverev: ¿He entendido bien que f(++a) y f(a++) provocan diferentes variantes de f en su muestra?
No, se trata de un error de compilación, es decir, aún no se ha llegado a la ejecución (llamadas específicas). Las cadenas (1) y (2) son equivalentes desde el punto de vista del código (escritura diferente de lo mismo)
Aquí hay otra muestra para que no tenga la impresión de que se trata sólo del 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
}
#property libraryclass 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 ) { return0; }
class B : public A {
virtualvoid g();
};
void B::g()
{
f( 0, 0, false ); //нормально
f( 0, 0 ); //tree optimization error
}
class C {};
void start( C* ) export {}
Como el"error de optimización del árbol" no es fácil de localizar, pido a los desarrolladores (si tienen esa posibilidad) que pongan toda la optimización en la clave de optimización (gracias a Dios que existe), de lo contrario, incluso con la optimización desactivada los programas que funcionan resultan estar totalmente desactivados después de la actualización de la compilación (y es imposible volver atrás).
Tenga en cuenta que todos los errores de hoy no son antiguos, sino nuevos - antes (build 1241)todo funcionaba
¿Por qué aparece la "basura" cuando se utiliza un estilista?
Error de compilación (build 1327)
Error de compilación
Error de compilación
Nota especial: si se intercambian las líneas (1) y (2) no pasa nada, lo que requiere una comprobación adicionalError de compilación
Me gustaría señalar especialmente que si se intercambian las líneas (1) y (2), todo está bien, lo que requiere una comprobación adicional¿He entendido bien que f(++a) y f(a++) provocan diferentes variantes de f en su muestra?
No, se trata de un error de compilación, es decir, aún no se ha llegado a la ejecución (llamadas específicas). Las cadenas (1) y (2) son equivalentes desde el punto de vista del código (escritura diferente de lo mismo)
Aquí hay otra muestra para que no tenga la impresión de que se trata sólo del operador ++
Las líneas (1) y (2) son equivalentes en términos de código (escritura diferente de lo mismo)
Al fin y al cabo, ++a y a++ tienen un significado diferente. ¿No crees?
Error de compilación: error de optimización del árbol
Como el"error de optimización del árbol" no es fácil de localizar, pido a los desarrolladores (si tienen esa posibilidad) que pongan toda la optimización en la clave de optimización (gracias a Dios que existe), de lo contrario, incluso con la optimización desactivada los programas que funcionan resultan estar totalmente desactivados después de la actualización de la compilación (y es imposible volver atrás).
Tenga en cuenta que todos los errores de hoy no son antiguos, sino nuevos - antes (build 1241) todo funcionabano hay a++
Sí. Por eso lo hice más específico.
¿He entendido bien que f(++a) y f(a++) provocan diferentes variantes de f en tu ejemplo?