Неопределенный символ с использованием шаблона - PullRequest
3 голосов
/ 08 декабря 2010

Я получаю ошибку компоновщика при создании этого кода:

Исключить.h файл

class IsExclude
{
    public:
        template<typename T>
        bool operator()(const T* par);
        virtual ~IsExclude() = 0;
};

IsExclude::~IsExclude() {}

class IsExcludeA : public IsExclude
{
    public:
        IsExcludeA(std::string toCompare) : toCompare_(toCompare)  {}
        template<typename T>
        bool operator()(const T* par)
        {
            return strcmp(par->Something, toCompare_.c_str() ) ? false : true ; 
        }
        ~IsExcludeA() {}
    private:
        std::string toCompare_;
};

В том же файле:

/*
 * loop over a container of function objects
 * if at least one of them return true the function
 * return true, otherwise false
 * The function was designed to evaluate a set of
 * exclusion rule put in "and" condition.
 */
template<typename T,typename P>
bool isExclude( const T& cont, const P* toCheck )
{
    typename T::const_iterator pos;
    typename T::const_iterator end(cont.end());
    bool ret(false);
    for (pos = cont.begin(); pos != end; ++pos)
    {
        if ( (*pos)->operator()(toCheck) == true )
        {
            ret = true;
            pos = end;
        }
    }    
    return ret;
}

Файл cpp, в котором я использую предыдущий вызов, выглядит так:

std::vector<IsExclude* > exVector;

exVector.push_back( new IsExcludeA(std::string("A")) );
exVector.push_back( new IsExcludeA(std::string("B")) );

if (isExclude(exVector,asset) == false)
{
     // Blah
}

Код компилируется нормально, но я получил ошибку от компоновщика: Неопределенная первая ссылка символ в файле bool IsExclude :: operator () (const __type_0 *) MyFile.o

Есть ли у вас какие-либо подсказки или предложения?

P.S. Я знаю, что мне нужно очистить вектор, чтобы избежать утечки памяти. Я не могу использовать boost :: shared_ptr с моим компилятором. Вздох!

1 Ответ

3 голосов
/ 08 декабря 2010

В функции isExclude вы пишете:

if ( (*pos)->operator()(toCheck) == true )

Это вызывает IsExclude::operator(), который объявлен, но не определен, поэтому у компоновщика есть веская причина жаловаться.Мне кажется, что вам бы хотелось бы иметь полиморфное поведение на operator(), но вы попали в ловушку "функции шаблона не могут быть виртуальными".

Трудно вам помочьне зная, каковы ваши требования, но, возможно, вам следует пересмотреть наличие шаблонного operator() и перейти на virtual operator().

...