En un programa, la siguiente estructura se define en un archivo de encabezado:

\\structs.h
#include <vector>
using std::vector;
using namespace std;
struct cell
{
    double x;
    vector<int> nn;
};

En un archivo fuente separado defino la función:

\\functions.cpp
# define _CRT_SECURE_NO_DEPRECATE
# include <stdio.h>
# include <iostream>
# include <math.h>
# include <vector>
# include "structs.h"
using namespace std;

void initial_position(vector<cell>& cluster, int n)
{
    cell tmp;
    for (int i = 0; i < n; i++)
    {
        tmp.x = 1;
        cluster.push_back(tmp);
    }
}

Con un archivo de encabezado:

//functions.h
# include <vector>
using std::vector;

void initial_position(vector<cell>& cluster, int n);

Deseo llamar a esta función en el script principal:

//main.cpp
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <vector>
#include "functions.h"
#include "structs.h"  
using namespace std;

int main()
{   
    vector <cell> cluster;
    int n = 100;
    initial_position(cluster,n);
    return 0;
}

Pero obtén los siguientes errores:

funciones.h (4): error C2065: 'celda': identificador no declarado

functions.h (4): error C2923: 'std :: vector': 'cell' no es un argumento de tipo de plantilla válido para el parámetro '_Ty'

funciones.h (4): error C3203: 'asignador': la plantilla de clase no especializada no se puede usar como argumento de plantilla para el parámetro de plantilla '_Alloc', se esperaba un tipo real

main.cpp (14): error C2664: 'void initial_position (std :: vector &)': no se puede convertir el argumento 1 de 'std :: vector>' a 'std :: vector &'

¿Cuál es la fuente de los errores? Todo parece estar bien definido.

c++
0
jarhead 17 ene. 2018 a las 10:34

3 respuestas

La mejor respuesta

Solo cambiar

#include "functions.h"
#include "structs.h"  

Con

#include "structs.h"  
#include "functions.h"

Dado que la celda se declara en structs.h y se necesita en funciones.h

O mejor aún, incluya structs.h en funciones.h

Tampoco debe colocar usando el espacio de nombres estándar en un encabezado, eso es una mala práctica. Puede causar algunos errores desagradables difíciles de encontrar, ver p. ¿Por qué "usar el espacio de nombres std" se considera una mala práctica?

-2
AndersK 17 ene. 2018 a las 09:40

Poner

#include "structs.h" 

En funciones.h y proteger tanto structs.h como funciones.h con incluir-guardias, p.

#pragma once

Si está disponible.

4
Jive Dadson 17 ene. 2018 a las 07:49

Añadir

#include "structs.h" 

En funciones.h ya que en funciones.h el compilador no sabe qué es la celda.

2
Shawn 17 ene. 2018 a las 07:50