CLion не может автоматически заполнять код шаблона C ++ - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть следующий класс 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. Как видите, модульные тесты пройдены, поэтому код скомпилирован. Я не вижу проблемы, и это очень расстраивает.

...