Как объявить указатель на объекты для нетиповых шаблонов? - PullRequest
0 голосов
/ 18 сентября 2018

пожалуйста, рассмотрите следующий пример:

template <int N, int M>
class MyClass {
    private:
       void myFunc(void);

    public:
        void callMe(void);

    };

Мне нужно объявить универсальный указатель на объекты этого класса.Компилятор отклоняет следующее утверждение.Что я делаю неправильно?Спасибо за помощь.

extern template<int N, int M> MyClass<N, M> *obj;

Почему я это делаю?Мне нужно написать функцию, которая может работать с универсальным экземпляром объектов из этого класса, пожалуйста, посмотрите пример:

inline template <int N, int M> void MyClass<N,M>::MyFunc(void) { obj = this; };

Это поведение, которое я хочу, если это возможно.Обратите внимание, что он отлично работает с типами без шаблонов.

void ThisIsAnotherFunction(void) {
    obj->callMe();
}

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Ваш вопрос допускает как минимум две интерпретации ...

I) ... вы хотите полиморфизм во время выполнения

Различные экземпляры одного и того же шаблона являются совершенно не связанными типами.Если вы хотите, чтобы они использовали общий интерфейс, вы можете использовать общий базовый класс:

struct base {
    /* declare common interface here */
};

template <int N, int M> struct foo : base {};

II) ... вам нужна переменная obj для каждого экземпляра шаблона

Это пахнет как синглтон, и я не уверен, имеет ли смысл делать это, но это было бы что-то вроде:

template <int N,int M> struct foo {
    constexpr static const foo* obj = new foo();    
};
0 голосов
/ 18 сентября 2018

Для записей я решил использовать предложение, написанное # user463035818 (спасибо, чувак!).Я создал базовый класс с callMe в качестве виртуальной функции (см. Первоначальный пример).Спасибо всем, кто оказал им поддержку.Надеюсь, что скоро воздаю.

0 голосов
/ 18 сентября 2018

Ваши разные классы шаблонов не будут иметь ничего общего.Что вы можете сделать, так это чтобы ваши шаблонные классы имели общий базовый класс, например:

struct BaseClass {};

template <int N, int M>
class MyClass : BaseClass {
    /*stuff*/
};

extern BaseClass* obj;

Если вы хотите указатель на конкретный конкретный тип, у вас нет выбора, кроме как предоставить значения для N иМ в вашей декларации.

extern MyClass<2, 3>* obj2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...