У меня есть следующий класс C ++, из которого я хотел бы иметь обобщенную реализацию c. Я в настоящее время кодирую с Clion, все работает нормально. Однако после достижения линии 59 CLion перестает работать полностью. Я прокомментировал положение, когда автозаполнение перестало работать. Реализация класса без шаблона заставляет CLion снова работать.
Что я делаю не так? Это проблема с CLion? Или я использую шаблонное программирование на C ++ неправильно? Я пришел из Java, и шаблон C ++ очень похож на шаблоны Java, поэтому я думаю, что код будет работать без проблем.
#ifndef TRIANGULATION_INCREMENTAL_H
#define TRIANGULATION_INCREMENTAL_H
#include <vector>
#include "point.hpp"
#include "triangle.hpp"
#include "edge.hpp"
namespace tri::inc {
/**
* Bowyer Watson Algorithm https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm
*/
template<typename T>
class Incremental {
public:
/*
* Set of coordinates defining the points to be triangulated
*/
std::vector<tri::Point2D<T>> points;
Incremental() = default;
explicit Incremental() {
this->points = points;
}
std::vector<tri::Triangle<T>> triangulate() {
std::vector<tri::Triangle<T>> ret;
T minX = this->points[0].x;
T minY = this->points[0].y;
T maxX = this->points[0].x;
T maxY = this->points[0].y;
for(auto i: this->points){
if(i.x < minX){
minX = i.x;
}
if(i.y < minY){
minY = i.y;
}
if(i.x > maxX){
maxX = i.x;
}
if(i.y > maxY){
maxY = i.y;
}
}
auto dx = maxX - minX;
auto dy = maxX - minY;
auto dMax = std::max(dx, dy);
auto midX = (minX + maxX) / 2;
auto midY = (minY + maxY) / 2;
Point2D<T> p1(midX - 20 * dMax, midY - dMax);
Point2D<T> p2(midX, midY + 20 * dMax);
Point2D<T> p3(midX + 20 * dMax, midY - dMax);
Triangle<T> bigTriangle(p1, p2, p3);
ret.push_back(bigTriangle);
// Autocompletion stops working after this line
for(auto i = points.begin(); i != points.end();){
std::vector<tri::Edge<T>> polygon;
for(int tr = 0; tr < ret.size(); tr++){
tri::Triangle<T> j = ret[tr];
if(j.circumscribedCircleContains(*i)){
j.isBad = true;
polygon.push_back(Edge{j.v1, j.v2});
polygon.push_back(Edge{j.v2, j.v3});
polygon.push_back(Edge{j.v3, j.v1});
}
}
for(auto j = ret.begin(); j != ret.end();){
if(*j.isBad){
j = ret.erase(j);
}else{
++j;
}
}
}
return ret;
}
};
}
#endif
Ниже приводится полный код программы https://github.com/longuyen97/triangulation/commit/3f2de04097fdadafe2719228a1ee6b6ca6d96784. Как видите, модульные тесты пройдены, поэтому код скомпилирован. Я не вижу проблемы, и это очень расстраивает.