Задать вопрос
Nightmare1
@Nightmare1
Программист

Почему возникает ошибка?

In file included from Machinery/Classes/Node.cpp:1:
Machinery/Classes/Node.hpp: В функции-члене «Node& Node::find_in_nodes_by_name(const std::string&) const»:
Machinery/Classes/Node.hpp:183:5: предупреждение: в функции, которая должна возвращать значение, отсутствует оператор return [-Wreturn-type]
  183 |     }
      |     ^
Machinery/Classes/Node.cpp: В функции-члене «bool QuadNavigation<T>::isFullyConnectedQuad() const»:
Machinery/Classes/Node.cpp:60:18: ошибка: «haveNext» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «haveNext» [-fpermissive]
   60 |                  haveNext() &&
      |                  ^~~~~~~~


#pragma once
#ifndef __PARENTABLE_HPP_
#define __PARENTABLE_HPP_

#include "Nameable.h"
#include "../Interfaces/IParentable.hpp"
#include "../Interfaces/IConnectable.hpp"
#include "BaseGUISegmentClass.hpp"
#include <memory>

/**
 * @brief Объект связанной нити. Квадратная навигация элементов.
 * 
 * @tparam T 
 */
template<typename T> class LinearNavigation : public Machinery::Interfaces::IConnectable
{
  ParameterGetSetTypedDefault(std::unique_ptr<T*>, next_element, nullptr);
  ParameterGetSetTypedDefault(std::unique_ptr<T*>, prev_element, nullptr);

  public:
    /**
     * @brief Get the Left Element object
     * Получить левый элемент.
     * @return T& 
     */
    T& getLeftElement() const;

    /**
     * @brief Get the Right Element object
     * Получить правый элемент.
     * @return T& 
     */
    T& getRightElement() const;

  public:
    /**
     * @brief Имеется ли следующий объект в связи.
     * 
     * @return true 
     * @return false 
     */
    virtual bool haveNext() ;

    /**
     * @brief Имеется ли предыдущий объект в связи.
     * 
     * @return true 
     * @return false 
     */
    virtual bool havePrev() ;

    /**
     * @brief Алиас (альтернативное имя) для функции hasPrev;
     * 
     * @return true 
     * @return false 
     */
    inline virtual bool havePrevious() const {return havePrev();}

    /**
     * @brief Есть ли у объекта связи.
     * 
     * @return true 
     * @return false 
     */
    inline virtual bool haveConnection() const {return haveNext() || havePrev();}

    /**
     * @brief Подключен ли объект.
     * 
     * @return true 
     * @return false 
     */
    inline virtual bool isLinked() const {return haveConnection();}
};

/**
 * @brief Квадратная навигация объектов. Связывания объектов лево / право , вверх / вниз.
 * 
 * @tparam T 
 */
template<typename T> class QuadNavigation : public LinearNavigation<T>
{
  ParameterGetSetTypedDefault(std::unique_ptr<T*>,   up_element, nullptr);
  ParameterGetSetTypedDefault(std::unique_ptr<T*>, down_element, nullptr);

  public:
    /**
     * @brief Get the Top Element object
     * Получить верхний элемент.
     * @return T& 
     */
    T& getTopElement() const;

    /**
     * @brief Get the Bottom Element object
     * Получить нижний элемент.
     * @return T& 
     */
    T& getBottomElement() const;

    /**
     * @brief Имеется ли верхнее соединений.
     * 
     * @return true 
     * @return false 
     */
    bool haveTopConnected() const;

    /**
     * @brief Имеется ли нижнее соединение.
     * 
     * @return true 
     * @return false 
     */
    bool haveBottomConnected() const;

    /**
     * @brief Проверить, полностью ли соединенный элемент.
     * 
     * @return true 
     * @return false 
     */
    bool isFullyConnectedQuad() const;
};

#include <utility>

/**
 * @brief Класс образующий Родитель / Дочерние связи, структуру.
 */
class Node : public Machinery::Classes::Nameable
{
  //ParameterGetSetTyped(std::unique_ptr<void*>, content_data);

  std::pair< QuadNavigation<Node>, Machinery::Interfaces::Parentable<Node*> > links_pair;

  public:

    /**
     * @brief Есть ли дочерние элементы объекта.
     * 
     * @return true 
     * @return false 
     */
    inline virtual bool haveChildNodes() const {return !links_pair.second.get_childrens().empty();}

    /**
     * @brief Есть ли родительские элементы объекта.
     * 
     * @return true 
     * @return false 
     */
    inline virtual bool haveParentNodes() const {return !links_pair.second.get_parents().empty();}

    /**
     * @brief Есть ли следующий связанный элемент.
     * 
     * @return true 
     * @return false 
     */
    virtual bool haveNextNode() const {return haveNextNode();}

    /**
     * @brief Есть ли предыдущий связанный элемент.
     * 
     * @return true 
     * @return false 
     */
    inline virtual bool havePrevNode() const {return havePrevNode();}

    /**
     * @brief Find node by it's name.
     * Поиск элемента по имени.
     * @param name 
     * @return Node<T>& 
     */
    inline Node & find_in_nodes_by_name(const std::string & name) const
    {
      for(auto &item : links_pair.second.get_childrens());
        //if(item->getName().find(name) != item->getName().end()) return item;
    }

    //inline Node& find_in_nodes_next_one_by_name(const std::string & name) const;
    //inline Node& find_in_nodes_prev_one_by_name(const std::string & name) const;
    //inline Node& find_in_nodes_next_one_by_name_cycled(const std::string & name) const;
};

#endif // __PARENTABLE_HPP_


#include "Node.hpp"

template <typename T> bool LinearNavigation<T>::haveNext() 
{
  return get_next_element() ? true : false;
}

template <typename T> bool LinearNavigation<T>::havePrev() 
{
  return get_prev_element() ? true : false;
}

template<typename T> T& LinearNavigation<T>::getLeftElement() const
{
  return *get_prev_element();
}

template<typename T> T& LinearNavigation<T>::getRightElement() const
{
  return *get_next_element();
}













template<typename T> T& QuadNavigation<T>::getTopElement() const
{
  return *get_up_element();
}

template<typename T> T& QuadNavigation<T>::getBottomElement() const
{
  return *get_down_element();
}

template<typename T> bool QuadNavigation<T>::haveTopConnected() const
{
  return getTopElement() ? true : false;
}

template<typename T> bool QuadNavigation<T>::haveBottomConnected() const
{
  return getBottomElement() ? true : false;
}

template<typename T> bool QuadNavigation<T>::isFullyConnectedQuad() const
{
  return 
         haveTopConnected() &&
      haveBottomConnected() &&
                 haveNext() &&
                 havePrev();
}



Почему возникает ошибка.
  • Вопрос задан
  • 170 просмотров
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
В find_in_nodes_by_name у вас return закомментирован. Это первая ошибка.

По второй ошибке: попробуйте написать LinearNavigation<T>::haveNext() там, где оно вызывается в isFullyConnectedQuad.

Эта ошибка возникает из-за хитросплетения стандарта С++. Ну вот не ищет компилятор вот такие функции не завсящие от шаблонного аргумента по всем шаблонам. Замучается искать, на самом деле, если бы это было включено всегда.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы