Неопределенный символ: vtable

Так что это одна из этих ошибок компилятора, когда я просто не могу выяснить источник проблемы.

Это класс LocalQualityMeasureзаголовок

#include <unordered_set>

#include "../clustering/Clustering.h"#include "../graph/Graph.h"
namespace Project {

/**
* Abstract base class for all local clustering quality measures.
*/
class LocalQualityMeasure {public:

LocalQualityMeasure();

virtual ~LocalQualityMeasure();

virtual double getQuality(std::unordered_set<node>& C, Graph& G) = 0;
};

} /* namespace Project */

и источник:

#include "LocalQualityMeasure.h"
namespace Project {

LocalQualityMeasure::LocalQualityMeasure() {
}

LocalQualityMeasure::~LocalQualityMeasure() {
// TODO Auto-generated destructor stub
}} /* namespace Project */

И это производный класс Conductanceзаголовок

#include <algorithm>

#include "LocalQualityMeasure.h"
namespace Project {

class Conductance: public Project::LocalQualityMeasure {
public:
Conductance();
virtual ~Conductance();

virtual double getQuality(std::unordered_set<node>& C, Graph& G);
};

} /* namespace Project */

и источник

#include "Conductance.h"
namespace Project {

Conductance::Conductance() : LocalQualityMeasure() {
}

Conductance::~Conductance() {
// TODO Auto-generated destructor stub
}

double getQuality(std::unordered_set<node>& C, Graph& G) {

double volume = 0;
double boundary = 0;
double all = 0;

for (auto it = C.begin(); it != C.end(); ++it) {
volume = volume + G.degree(*it);
G.forNeighborsOf(*it, [&](node v){
if (C.find(v) == C.end()) boundary++;
});
}

G.forNodes([&](node v){
all = all + G.degree(v);
});

if (volume == 0 || all-volume == 0)
return 1;
return boundary / std::min(volume, all-volume);
}

} /* namespace Project */

Компоновщик жалуется на отсутствующий vtable:

Undefined symbols for architecture x86_64:
"Project::Conductance::getQuality(std::unordered_set<long long, std::hash<long long>, std::equal_to<long long>, std::allocator<long long> >&, Project::Graph&)", referenced from:
vtable for Project::Conductance in Conductance.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [Project-CommunityDetection-DPar] Error 1

Я использую GCC 4.7 с --std=c++11,

1

Решение

Вы забыли область действия класса в вашей реализации getQuality:

double Conductance::getQuality(std::unordered_set<node>& C, Graph& G)
{
.....
}
7

Другие решения

Вам нужно добавить в ваш файл реализации область видимости:

double Conductance::getQuality(std::unordered_set<node>& C, Graph& G) {...

В противном случае компоновщик не сможет найти реализацию для метода, определенного в заголовке.

2

По вопросам рекламы [email protected]