Estoy tratando de organizar mi programa en funciones y se encontró con esto,

de error: «falta de argumentos de plantilla antes de ‘.’ token»

una vez que intento ejecutar el código de la función, funciona bien si sólo en main(). Cualquiera que esté familiarizado con este error de conocer lo que el problema puede ser?

Nota, el código comentado elimina el error, pero se mete con la lista ordenada class y restablece su longitud o algo, causando la orderedlist.getlength() función return 0, lo que hace que ninguno de los de código en el while() bucle de ejecución.

función:

void rentFilm(char* filmId, char* custId, char* rentDate, char* dueDate, int numFilm)
{
    //orderedList <filmType> orderedList(numFilm);
    //filmType newItem;
    int index = 0;
    bool found = false;

    while (index < orderedList.getLength() && !found)
        {
            cout << "test" << endl;
        if (strncmp(filmId,orderedList.getAt(index).number,6) == 0 && strncmp("0000",orderedList.getAt(index).rent_id,5) == 0)//If that film is rented by NO customer
            {
                cout << "test" << endl;
                found = true;//customer can rent it
                strcpy(newItem.number,filmId);
                orderedList.retrieve(newItem);
                orderedList.remove(newItem);
                strcpy(newItem.rent_id,custId);
                strcpy(newItem.rent_date,rentDate);
                strcpy(newItem.return_date,dueDate);
                orderedList.insert(newItem);
                cout << "Rent confirmed!" << endl;
            }
        else
            {
                if (strncmp(filmId,orderedList.getAt(index).number,6) > 0 || strncmp("0000",orderedList.getAt(index).rent_id,5) > 0)
                    {
                        ++ index;
                    }
                else
                    {
                     throw string ("Not in list");
                    }
            }
        }
}

Insertar en orderedList clase (donde la longitud se determina):

template <class elemType>
void orderedList<elemType>::insert(const elemType& newItem)
{
     int index = length - 1;
     bool found = false;

     if (length == MAX_LIST)
         throw string ("List full - no insertion");

         //index of rear is current value of length

     while (! found && index >= 0)
        if (newItem < list[index])
        {
            list[index + 1] = list [index];  //move item down
            --index;
        }
        else
            found = true;

     list [index + 1] = newItem;  //insert new item
     ++length;
}

código principal donde la lista se llena:

filmFile.open("films.txt", ios::in);
filmFile >> numFilm;
filmFile.get();

orderedList <filmType> orderedList(numFilm);
filmType newItem;

readString(filmFile, newItem.number,5);
    for (int i = 0; i < numFilm; i++)
    {
         newItem.copy = filmFile.get();
     readString(filmFile, newItem.title,30);
         readString(filmFile, newItem.rent_id,4);
         readString(filmFile, newItem.rent_date,8);
         readString(filmFile, newItem.return_date,8);
         filmFile.get();

         orderedList.insert (newItem);//puts filmType struct into the ordered list.

         readString(filmFile, newItem.number,5);
    }

Por favor, hágamelo saber si el código de cualquier otro lugar en el programa podría ser útil en la evaluación de este error.

  • ¿Qué es orderedlist ? Es un class ?
  • Sí, es una clase, y orderedList(numFilm) es un constructor
  • No parece haber ningún problema con este código. Es posible que desee dar mínimo de código para class orderlist.
  • Añade un poco de código relevante, eso no ayuda en absoluto?
  • Usted está en ninguna parte cerca de listo para trabajar con plantillas aún. Volver a estudiar la diferencia entre una clase y una instancia de la clase.
InformationsquelleAutor darko | 2011-11-04

3 Comentarios

  1. 1

    Parece que la línea que comenta declara una variable con el mismo nombre que la clase.

    Así que cuando un comentario, funciones estáticas de la clase están siendo invocado.

    Cambiar la declaración a algo así como:

    orderedList<filmType> filmList(numFilm);

    y, a continuación, cambiar todas las referencias de orderedList en la función filmList.

    • Esto tiene el mismo efecto de restablecer mi lista de longitud a 0, como si orderedList no se cambió el nombre a algo más.
    • Mi conjetura es que usted necesita para insertar todos los elementos en la lista para hacer su longitud distinta de cero. No sé nada acerca de la clase que estamos instanciando, pero apuesto a que el argumento que se le pasa al constructor sólo sugerencias acerca de cómo muchos de los elementos pre-asignar en un vector, por lo que no necesitan para crecer el vector.
    • A la derecha, esta es la forma, la longitud se determina. Como los elementos son insertados en la clase, la longitud aumenta.
    • No hay ningún código para insertar elementos en la clase entre el momento en que se declara y cuando usted lo usa, por lo que la longitud debe ser igual a cero. Tal vez usted quiere ser estática, o global?
    • Yo la inserción de elementos en mi principal, si este código en principal, que iba a funcionar bien. todo lo que estoy tratando de hacer ahora es dividir el programa en funciones y la única razón por la que tengo esta declaración en esta función, ya que sin ella la «Falta de argumentos de plantilla antes de ‘.’ token» se genera un error
    • De nuevo, si se define la variable en algún lugar fuera de esta función, es necesario pasar como parámetro o hacerlo global. Creo que usted necesita para leer sobre el alcance y la declaración de variable.
    • Cuál es la variable? filmType o orderedList?
    • orderedList es una clase. filmType es una variable; es una instancia de orderedList (que es confusamente llamado y probablemente sería mejor como OrderedList).
    • hmm, en realidad filmType es un tipo, newItem es la variable, no?
    • permítanos continuar esta discusión en el chat

  2. 0

    Es el problema que se va a crear una variable con el mismo nombre de la plantilla? Cuando usted dice,

    orderedList<filmType> orderedList(numFilm);

    que el (tipo de) como diciendo,

    int int=42;

    y luego esperar que los int+1 para volver 43

    Probar algo parecido,

    orderedList<filmType> ol(numFilm);

    Y cambiando todas las otras referencias a orderedList, a ol.

    • Esto es similar a los moishes asesoramiento, se mete con los datos en mi programa. Yo uso orderedList <filmType> orderedList(numFilm); en principal y parece que funciona bien
    • ¿Saber que orderedList(numFilm); es mi orderedLists constructor tiene algún significado aquí?
    • No, No es así, es una variable que está siendo creado a partir de ese constructor.
  3. 0

    Parece que rellenar una variable orderedList en main() y luego esperar a estar automáticamente disponibles en rentFilm(...) cuando se declara con el mismo nombre; que no es posible. Usted tiene que pasar el objeto a la función de main() o mejor hacer que funcionan como método de miembro de la class orderedList:

    int main ()
    {
      orderedList<filmType> ol(numFilm); //variable name different (good practice)
      ... //all the populating
      orderedList.rentFilm(...);  //call the function like this
    }

    donde, rentFilem() es ahora parte de la class

    class orderedList {
    ...
    public:
      void rentFilm(char* filmId, char* custId, char* rentDate, char* dueDate, int numFilm);
    };

    Ahora dentro de la función, usted no tiene que declarar la variable para orderedList; sólo usar this-><method/variable>. Se debe trabajar.

    • Se necesita el nombre de un objeto, no una plantilla de clase, en el lado izquierdo de .. Ese es el problema, la pregunta es preguntar acerca de.
    • que pregunta que surge es si OP comentarios en el código. En la última parte de la pregunta, OP está preguntando, ‘¿por qué no funciona si el código es sin comentarios’ ? (en realidad, de la plantilla de nombre de clase y el mismo nombre de objeto es permitido por el compilador)
    • Sí, pero yo estoy hablando de su «fijo» de código, que tiene el mismo problema. El comentario de «llamar a la función como esta» realmente no lo es.

Dejar respuesta

Please enter your comment!
Please enter your name here