Este es el error:

error: static member function static void myClass::myfunct()’ cannot have cv-qualifier

Por favor alguien puede explicar este error y por qué const no se puede utilizar.

#include<iostream>
class myClass{      
   static void myfunct() const 
   { 
     //do something
   }
};

int main()
{
   //some code
   return 0;
}
  • ¿Qué estás tratando de hacer con la palabra const?
  • posibles duplicados de por Qué no existe el concepto de «const-corrección» para la clase de las funciones miembro estáticas?
  • const en función estática podría ser utilizado para prevenir la estática de la función de cambiar el estado de la clase. Entonces, ¿por qué el error o por lo que el estándar?
  • Usted parece estar cambiando su pregunta. Primero te preguntas «¿Qué significa esto?» Ahora usted se está preguntando «¿por Qué no decir lo que yo quiero decir?». Preguntas acerca de por qué un lenguaje está diseñado de una manera determinada realmente no se ajustan a este sitio, ya que no son prácticas. (Si el lenguaje está diseñado de la manera que te gusta, no altera el hecho de que usted tiene que programar para el idioma, no el idioma en que desea que usted tenía.) En cualquier caso, hay una cierta discusión de los fundamentos en los enlaces duplicados.
InformationsquelleAutor Sahil Sareen | 2013-11-06

5 Comentarios

  1. 36

    Vale la pena citar la norma aquí

    9.4.1 las funciones miembro Estáticas

    2) [ Nota: Una función miembro estática no tiene un puntero this (9.3.2). —nota final ] Un static miembro
    la función no será virtual. No habrá un static y nostatic función miembro con el
    mismo nombre y los mismos tipos de parámetros (13.1).

    Una función miembro estática no será declarado const,
    volatile, o const volatile
    .

    static funciones no tienen this parámetro. Ellos no necesitan de cv-calificadores.

    Ver este respuesta por James McNellis

    Cuando se aplica el const calificador a una función miembro no estático,
    afecta a la this puntero. Para una const-miembro calificado de la función
    de clase C, el this puntero es de tipo C const*, mientras que para un
    función miembro que no es const-calificado, el this puntero es de
    tipo de C*.

    • Citando la norma es la única respuesta correcta. Otras respuestas han sugerido que «no tiene sentido» como una razón. Usted podría (yo no lo voy a hacer) argumentan que const en miembro estático impediría la función estática de la mutación del estado de la clase (es decir, variables de miembro estático) y por lo tanto podría dar sentido a su justo el comité de estándares hecho una elección que no era cómo se iba a trabajar.
    • Que podría cambiar el significado de const cuando se aplica a una función. El significado de hacer una función const es cambiar el tipo de this de T* a T const*. Esto significa claramente que sólo se aplican a los miembros no estáticos, por lo que el comité eligió lo que hizo. Para tener las cosas de otra manera, usted’ld tienen que cambiar la definición de lo que const en una función.
    • el estándar no suelen decirle porque es algo. Citando el estándar a menudo sólo te dice lo que ya sabemos. En este caso, usted puede deducir un poco más porque no hay una sola mención de la this puntero, pero esto está lejos de explicar cualquier cosa.
    • Entiendo la razón por la que lo hizo y por qué. Pero cuando se construyó el estándar que podría tener bastante fácilmente argumentar de otra manera y se aplica una regla especial para los miembros de la clase. Personalmente me alegro de que no lo hicieron (el simple y limpio es mejor), pero básicamente se reduce a un árbitro de la elección (con argumentos disponibles para ambos lados). Así que su única opción es citar la norma.
    • +1 También, lo que es un gran nombre – al-Khwārizmī , yo no sabía cómo debe ser escrito en inglés.
  2. 12

    Un static función miembro no está obligado a una instancia de su clase, por lo que no tiene sentido que sea const y/o volatile (es decir, «cv-calificado»), porque no hay ninguna instancia a la que const o volatile puede ser aplicado en llamar a esa función.

  3. 4

    No tiene sentido escribir const allí, porque la función es static y por lo tanto no hay ninguna instancia de la clase en la que, para infundir un const contexto. Por lo tanto se trata como un error.

  4. 1

    Calificador const en un miembro de la declaración de la función se aplica al puntero al objeto de la clase. Como funciones estáticas no están vinculados a los objetos de la clase en la que no tienen ningún parámetro implícito este. Así que el calificador const no tiene ningún sentido para estas funciones.

  5. 1

    Const clasificación por funciones miembro significa que la función no va a cambiar la instancia del objeto y pueden ser llamados objetos const. Las funciones miembro estáticas no están vinculados a ninguna instancia de objeto y por lo tanto no tiene sentido para ellos a ser constante, ya que no llame a la función miembro estática en cualquier objeto. Es por eso que la norma lo prohíbe.

    class Foo
    {
    public:
        void memberFunc();
        static void staticMemberFunc();
    }
    
    Foo f;
    f.memberFunc();          //called on an object instance
    Foo::staticMemberFunc(); //not called on an object instance

Dejar respuesta

Please enter your comment!
Please enter your name here