Tengo una clase de contenedor de plantilla y necesito llamar a algunas funciones.
La función de visualización a continuación funciona bien, pero luego llamo a otras funciones y obtengo errores. El que tiene errores tiene parámetros y el otro no, no estoy seguro de si esta es la razón. Tal vez lo esté llamando mal y me falta alguna sintaxis de plantilla.

Una función solo muestra el int y otra "compara" los ints.

int main()
{
        Codeword<vector<int> >codeWord(intList); 
        Codeword<vector<int> >codeWord2(intList2);

        codeWord.displayWord();
        codeWord2.displayWord();
        codeWord.distance(codeWord2);//line 80 from error
}

Clase de plantilla:

template<class T>
class Codeword
{
    private:
    T containerName;

    public:
    Codeword(T _containerName) : containerName(_containerName) {};

    void distance(Codeword obj);
    void displayWord();
};

Esto funciona:

 template<class T>
    void Codeword<T>::displayWord()
    {
        int genWeight = weight();
        for(int i = 0; i < containerName.size(); i++)
        {
            cout << containerName[i].getNumber() << " ";
        }
        cout << "   ";
        cout << "Weight: " << genWeight << endl;
    }

Esto no:

template<class T>
void Codeword<T>::distance(T codeWordTwo)
{
    int difference = 0;

    for(int i =0; i < containerName.size(); i++)
    {
        for(int j = 0; < 3; j++)
        {
            cout << "Num1: " << containerName[j].getNumber() << " Num 2: " << codeWordTwo[j].getNumber() << endl;
            difference += containerName[j].getNumber() - codeWordTwo[j].getNumber();
            cout << "Diff: " << difference << endl;
        }
    }
}

Error:

"driver.cpp", line 80: Error: Formal argument obj of type std::vector<int> in call to Codeword<std::vector<int>>::distance(std::vector<int>) is being passed Codeword<std::vector<int>>.
-1
awyeanah2 26 oct. 2019 a las 08:48

1 respuesta

La mejor respuesta

Si crea de esta manera en main

Codeword<vector<int> >codeWord(intList);

Entonces T es vector<int>.
Por lo tanto, aquí, T todavía es:

template<class T>
void Codeword<T>::distance(T codeWordTwo)

Es decir. la función requiere un vector<int>, no un Codeword.

Eso es lo que te dice el compilador.

Si desea hacer esto, es decir, dar una palabra en clave:

codeWord.distance(codeWord2);

Entonces deberías declarar la función en consecuencia:

template<class T>
void Codeword<T>::distance(Codeword<T> codeWordTwo)
2
Yunnosch 26 oct. 2019 a las 06:15