questi sono i 3 file mi da problema con items mi dice was not declared in this scope, lo dichiaro nel main ma nemmeno funziona e tra l' altro la cosa non ha senso dal momento che lo ho dichiarato nella superclasse vector2d e passato alla classe sudoku con l' ereditarietà.

classi.h
codice:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstdlib>
#include<fstream>
#include<math.h>
#include<iomanip>
#include<vector>


using namespace std;
typedef vector< vector <int> > vettore;

const int UNASSIGNED =0;

class vector2d{

        public:
        vettore items;
        void StampaGriglia(vettore,int ,int &);
        void Crea_griglia(vettore &,int &);


};

class Sudoku: public vector2d
{
        private:
        int rig,col,num,SettoreInizioRig,SettoreInizioCol;
        bool CercaNonAssegnate(vettore, int &, int &,int );
        bool NumCerto(vettore, int , int , int ,int );
        bool UsedInRig(vettore, int , int ,int );
        bool UsedInCol(vettore, int , int ,int );
        bool UsedInBox(vettore, int , int , int ,int );

    public:
        bool SudokuSolver(vettore,int ,int &);

};
main.cpp
codice:
#include "classi.h"


 int main()
{
    int cont=0;
    int n=0;
    vector2d s;//dichiaro una variabile di tipo sudoku per richiamare i metodi della classe
    Sudoku v;
    s.Crea_griglia(items,n);


    if (v.SudokuSolver(items,n,cont) == true){// se il metodo SudokuSolver mi ritorna vero allora stampa la soluzione
    cout<<"\n\nLa soluzione del sudoku e': \n";
        s.StampaGriglia(items,n,cont);
        cout<<"\n\nSoluzione Trovata dopo "<<cont<<" cicli\n\n";
        }

    else
        cout<<"Non esistono soluzioni."<<endl;
    return 0;
}
sudoku.cpp
codice:
#include "classi.h"


 bool Sudoku::SudokuSolver(vettore items,int n,int &cont)
    {
        cont++;
        if(cont%50000000==0){
            cout<<"\n\nSoluzione parziale sudoku al ciclo "<<cont<<":\n\n";
            StampaGriglia(items,n,cont);
            system("pause");
        }
        int rig, col;

        if (!CercaNonAssegnate(items, rig, col,n))//valore sicuro assegnato non ci ripasso più
           return true;

        for (int num = 1; num <= n; num++)
        {

            if (NumCerto(items, rig, col, num,n))
            {
                items[rig][col] = num;

                if (SudokuSolver(items,n,cont))//Backtracking: chiamata ricorsiva
                    return true;

                items[rig][col] = UNASSIGNED;
            }
        }

        return false;

    }




//Questo metodo mi cerca una cella non ancora assegnata

bool Sudoku::CercaNonAssegnate(vettore items, int &rig, int &col,int n)
{
    for (rig = 0; rig < n; rig++)
        for (col = 0; col < n; col++)
            if (items[rig][col] == UNASSIGNED)//quando trovo uno zero in una casella ritorno vero
                    return true;

    return false;
}




    //Questo metodo mi dice se quel numero è gia usato in quella riga

bool Sudoku::UsedInRig(vettore items, int rig, int num,int n)
{
        for (int col = 0; col < n; col++)//scorrendo le colonne vedo gli elementi della riga
            if (items[rig][col] == num)
                return true;

        return false;
}




    //Questo metodo mi dice se quel numero è gia usato in quella colonna

bool Sudoku::UsedInCol(vettore items, int col, int num,int n)

    {

        for (int rig = 0; rig < n; rig++)//scorrendo le righe vedo gli elementi della colonna

            if (items[rig][col] == num)

                return true;

        return false;

    }



       //Questo metodo mi dice se quel numero è gia usato in quel box
       //Per box intendo il settore considerato

bool Sudoku::UsedInBox(vettore items, int SettoreInizioRig, int SettoreInizioCol, int num,int n)

    {

        for (int rig = 0; rig < (int)sqrt(n); rig++)
            for (int col = 0; col < (int)sqrt(n); col++)
                if (items[rig+SettoreInizioRig][col+SettoreInizioCol] == num)
                    return true;
        return false;

    }



    //Mi dice la casella sicura dove posso inserire il numero
bool Sudoku::NumCerto(vettore items, int rig, int col, int num,int n)

    {   //se tutti e tre sono falsi cioè non sta in riga non sta in colonna non sta nel box allora il numero è sicuro
        return !UsedInRig(items, rig, num,n) && !UsedInCol(items, col, num,n) &&
               !UsedInBox(items, rig - rig % (int)sqrt(n) , col - col % (int)sqrt(n), num,n);


    }



    // Stampa della griglia

void vector2d::StampaGriglia(vettore items,int n,int &cont)
{
    ofstream fout;//Dichiarazione variabile che mi permette di scrivere su file
    fout.open("cicli sudoku.txt", ios::app);//apro un file in modalità append per "appendere" più output
        if(cont%5000==0)//questo if serve per stampare ogni 5000 cicli la soluzione parziale del sudoku
        fout<<"\n\n Soluzione parziale sudoku al ciclo "<<cont<<":\n\n";


        for (int rig = 0; rig < n; rig++)
        {
            for (int col = 0; col < n; col++){

                cout<<setw(3)<<items[rig][col]<<"  ";//stampo in output la matrice
                fout<<setw(3)<<items[rig][col]<<"  ";}//stampo su file la matrice
                cout<<endl;
                fout<<endl;

        }
        fout<<"\n------------------------------------------------------------------------------------------\n";
        fout.close();
}

void vector2d::Crea_griglia(vettore &items ,int &n) // Si devono passare entrambe le variabili per riferimento
{

        string nomefile;
        cout<<"Inserire il nome del file: ";
        cin>>nomefile;
        int temp;
        nomefile+=".txt";//concateno il nome del file con la sua estensione
        ifstream fin(nomefile.c_str());//Sto operando sul file chiamato "nomefile"
        if( ! fin.is_open() ) // controllo che il file sia aperto
        return;

        fin>>n;//acquisisco dal fine la dimensione della griglia

    for ( int i = 0; i < n; i++ ) {

    items.push_back ( vector<int>() );
    for ( int j = 0; j < n; j++ )
    fin>>temp;
    items[i].push_back ( temp );
    }

fin.close();

 }