Указатель шаблона как участник - PullRequest
0 голосов
/ 09 октября 2018

Я получил два класса "DTreeEmbedder" и "модификатор".Embedder - это шаблонный класс, и я хочу манипулировать переменными-членами DTreeEmbedder.

class DTreeEmbedder:

class modifier; //forward declaration of modifier

using namespace ogdf;
using namespace ogdf::energybased::dtree;

template<int Dim>
class DTreeEmbedder
{
  public:
  //! constructor with a given graph, allocates memory and does 
  initialization
  explicit DTreeEmbedder(GLFWwindow * w, const Graph& graph);

  //! destructor
  virtual ~DTreeEmbedder();

  modifier* m_modifier;

В конструкторе

  template<int Dim>
  DTreeEmbedder<Dim>::DTreeEmbedder(GLFWwindow * w, const Graph& graph) : 
             m_graph(graph)
  {
        m_modifier = new modifier();
  }

Оба объекта нуждаются в доступеследовательно, прямое объявление.

#pragma once

#include "DTreeEmbedder.h"

class modifier
{
  public:
    modifier(DTreeEmbedder<int>* e);
    ~modifier();

    DTreeEmbedder<int>* m_embedder;

    void pca_project(int pc1,int pc2);
 };

pca_project - это функция, которая должна изменять значения / вызывать функции в m_embedder

В конструкторе модификатора:

modifier::modifier(DTreeEmbedder<int>* e)
{
   m_embedder = e;
}

pca function:

void modifier::pca_project(int pc1, int pc2)
{
   m_embedder->stop();
}

Поэтому мой подход:

  1. Создать DTreeEmbedder
  2. DTreeEmbedder создает модификатор с указателем на себя
  3. полученный модификаторуказатель на DTreeEmbedder и теперь может изменять значения этого объекта

Мои ошибки:

"int": Invalid type for the non-type template parameter "Dim"
This pointer can not be converted from "DTreeEmbedder" to "DTreeEmbedder <Dim> &"

Заранее

1 Ответ

0 голосов
/ 09 октября 2018

Измените template<int Dim> на template<class Dim>

ИЛИ

Внимательно посмотрите на ошибку: -

"int": Invalid type for the non-type template parameter "Dim"

Здесь вы назначили класс внутри параметра, который вы так объявили как template<int Dim>.

Что "не тип" здесь означает, что вы присваиваете класс внутри шаблона, параметром которого является int ( NOT class).

Пример:

template<int Dim>
int Sum(int with)
{
    return Dim + with;
}


Объяснение:

Здесь «шаблон функции» объявляется с параметром шаблона Dim типа int,Это переменная , которая будет содержать integer (не класс, то есть то, что вы пытаетесь сделать там ...), который будет назначен ей при использовании.Примерно так: -

auto S = Sum<2>(2);

Здесь в параметрах вы задали целое число "2" , шаблон принимает значение Dim (В этом случае 2 ) и добавляет его с параметром with, (в данном случае 2 ) внутри функции и возвращает результат выражения.( 2 + 2 = 4 )


Где ваша проблема заключается в этом конструкторе,

modifier(DTreeEmbedder<int>* e)

Здесь есть одна проблема, учитывая, что выобъявили Dim там как целое число, теперь добавление класса int внутри параметра неверно ...

Так должно быть: -

modifier(DTreeEmbedder<111>* e) // Or any other number, since Dim is an integer

Думайте об этом параметре шаблона как о реальной целочисленной переменной, так что вы делаете что-то вроде: -

int Dim = int; /*Which is a type (class)*/

in

DTreeEmbedder<int> /*Assigning a class to an integer (Dim in this case)*/

Другая ошибка - это ошибка присваивания, проверьте, совпадают ли обе переменные, даже целочисленные значения, назначенные внутри шаблона, должны совпадать, поскольку Dim является целым числом ...

Например, DTreeEmbedder<90> не равно DTreeEmbedder<91> или что-то в этом роде ...

С уважением,

Ruks.

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