Además de otras respuestas, a veces declarador tiene que estar entre paréntesis.
Por ejemplo:
struct A {};
struct B { A a; };
namespace N {
struct B { int a; };
void f()
{
A (::B::*p) = &::B::a; // this() cannot be omitted
}
}
Si ()
se omite en el código anterior, el compilador reconoce una consecutivo anidada nombre especificador A::B
en lugar de A
y ::B
, y emitirá un error.
Este paréntesis es necesario, pero a veces conduce a una situación engañosa.
struct A {
int m;
A() {}
A(int) {} // this isn't called
};
int i;
int main()
{
A(i); // this is a declaration
i.m = 1; // ok
}
En el código anterior, A(i)
es una declaración (y también una definición en este caso) de un objeto i
, en lugar de una expresión llamada al constructor con un argumento int
i
.
Espero que esto ayude.
Si bien esta es la sintaxis perfectamente legal para declarar un entero, por el bien de sus compañeros desarrolladores, cámbielo a 'int m;'. –