C ++ - ошибка при использовании шаблона класса - PullRequest
0 голосов
/ 14 октября 2011

В файле main.cpp ...

#include "pqueue.h"

struct nodeT;

struct coordT {
    double x, y;
};

struct arcT {
    nodeT *start, *end;
    double weight;
};

int arcComp(arcT *arg0, arcT *arg1){
    if(arg0->weight == arg1->weight)
        return 0;
    else if(arg0->weight > arg1->weight)
        return 1;
    return -1;
}

struct nodeT {
    coordT* coordinates;
    PQueue<arcT *> outgoing_arcs(arcComp); // error on this line
};

В файле pqueue.h ...

#ifndef _pqueue_h
#define _pqueue_h

template <typename ElemType>
class PQueue 
{
private:
    typedef int (*CallbackFunc)(ElemType, ElemType);
    CallbackFunc CmpFunc;

public:
    PQueue(CallbackFunc Cmp);
    ~PQueue();  
};

#include "pqueue.cpp"
#endif

В файле pqueue.cpp

#include "pqueue.h"

template <typename ElemType>
PQueue<ElemType>::PQueue(CallbackFunc Cmp = OperatorCmp)
{
    CmpFunc = Cmp;
}

template<typename ElemType>
PQueue<ElemType>::~PQueue()
{
}

ошибка C2061: синтаксическая ошибка: идентификатор 'arcComp'

1 Ответ

9 голосов
/ 14 октября 2011

Синтаксис просто неверен, вы не можете инициализировать элементы на месте;используйте конструктор.

struct nodeT {
    coordT* coordinates;
    PQueue<arcT *> outgoing_arcs;

    nodeT() : ougoing_arcs(arcComp) { }
};

Кроме того, вы не можете (обычно) определять шаблоны в файлах cpp, вы должны поместить полное определение в заголовочный файл.Конечно, вы #include используете файл cpp, а не рассматриваете его как отдельный модуль компиляции, но это все равно плохо, хотя бы потому, что он сбивает ожидания программистов и инструменты автоматической сборки.-помните, ваш код нарушает все правила именования C ++, с которыми я когда-либо сталкивался.

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