Шаблоны C ++ в Android NDK - PullRequest
       0

Шаблоны C ++ в Android NDK

2 голосов
/ 12 августа 2011

Я использую Android NDK r6 и Android SDK API 8 (2.2).

Я пытаюсь реализовать динамический список, такой как std :: vector, используя шаблоны, но я получаю множество ошибок в скомпилированных .o файлах.

Образец:

error

Как видите, ошибки возникают в скомпилированных файлах .o, а не в исходных файлах.

Определение класса:

template <class T>
class ArrayList{
    private:
        int mSize;

    public:
        /**
         * Construye una lista dinámica vacía.
         */
        ArrayList ();

        /**
         * Destructor.
         */
        ~ArrayList ();

        /**
         * Añade un elemento a la lista.
         *
         * @param element
         *              Elemento.
         */
        void add (T element);

        /**
         * Obtiene un elemento de la lista.
         *
         * @param index
         *              Índice del elemento. Rango válido de valores: [0, size()]
         * @return Elemento de la posición indicada o NULL si el índice no es válido.
         */
        T get (int index);

        /**
         * Elimina un elemento de la lista.
         *
         * @param index
         *              Índice del elemento. Rango válido de valores: [0, size()]
         */
        void remove (int index);

        /**
         * Vacía la lista.
         */
        void clear ();

        /**
         * Consulta el número de elementos de la lista.
         *
         * @return Número de elementos.
         */
        int size ();

        /**
         * Consulta si la lista esta vacía.
         *
         * @return true si está vaía, sinó false.
         */
        bool isEmpty ();
};

Реализация класса:

template <class T>
ArrayList<T>::ArrayList (){
    mSize = 0;
}

template <class T>
ArrayList<T>::~ArrayList (){

}

template <class T>
void ArrayList<T>::add (T element){

}

template <class T>
T ArrayList<T>::get (int index){
    T element;
    return element;
}

template <class T>
void ArrayList<T>::remove (int index){

}

template <class T>
void ArrayList<T>::clear (){

}

template <class T>
int ArrayList<T>::size (){
    return mSize;
}

template <class T>
bool ArrayList<T>::isEmpty (){
    return true;
}

Использование класса:

ArrayList<OtherClass> list;
OtherClass foo;
list.add (foo);

Ответы [ 2 ]

6 голосов
/ 12 августа 2011

Это код шаблона. У вас нет такого же заголовочного файла к cpp, как в обычном классе C ++. Я вообще реструктурирую это так:

foo.h:

#ifndef FOO_H
#define FOO_H

template <class T>
class Foo
{
    Foo();
};

// Note that the header file INCLUDES the cpp file. This is simply to maintain
// the general .h .cpp file structure, but adapt it to template code, where the
// implementation is supposed to be in the header file and is not compiled.
#include "Foo.cpp"

#endif

foo.cpp:

// Note that I do NOT include the header here. Also, do NOT compile this file.
// So if you have a makefile, be sure not to include this file in it.
template <class T>
Foo<T>::Foo()
{ }

Или вы можете просто вставить всю реализацию в заголовочный файл и вообще не иметь файла cpp. Это на самом деле имеет больше смысла, потому что вы НЕ компилируете файл cpp. Подробнее здесь .

2 голосов
/ 12 августа 2011

Это ошибка компоновщика. Определения функций-членов должны идти в самом заголовке, чтобы компилятор создавал экземпляр кода для функций-членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...