Создание не типизированной шаблонной функции класса-шаблона - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть файл заголовка со следующим, скажем temp.hh:

#include <iostream>
using namespace std;

template <typename T1, typename T2>
class MyClass
{
public:

    template <bool isTrue>
    void MyFunc(T1& t, T2 t2) const;
};

template <typename T1, typename T2>
template <bool isTrue>
void MyClass<T1,T2>::MyFunc(T1& t, T2 t2) const
{
    cout << t << " " << (int)t2 << " " << isTrue << endl;
}

Затем другой файл заголовка (temp2.hh), который только создает экземпляр функции MyFunc:

#include "temp.hh"

template <typename T1, typename T2>
void TEST_OP2(MyClass<T1,T2> *mc)
{
    T1 a = 3;
    T2 b = 7;
    mc->MyFunc<false>(a, b);
}

В main.cpp у меня есть следующее:

#include "temp2.hh"

int main(void)
{
    MyClass<int, int8_t>* myclass = new MyClass<int, int8_t>();
    /* The following 3 commented lines compiles and runs fine,
       if I only include temp.hh */
    // int a = 3;
    // int8_t b = 7;
    // myclass->MyFunc<false>(a, b);
    TEST_OP2<int, int8_t>(myclass); // !! this fails to compile !!
}

Ошибка:

temp2.hh:8:9: reference to non-static member function must be called
    mc->MyFunc<false>(a, b);

Может кто-нибудь объяснить, почему это происходит, и как правильно это сделать, еслиэто вообще возможно?

ПРИМЕЧАНИЕ. Как вы можете заметить, это всего лишь пример кода, воспроизводящего проблему, с которой я столкнулся.В реальном проекте по разным причинам у меня не может быть полного экземпляра MyFunc в файле cpp (как прокомментированные коды в main.cpp выше).

РЕДАКТИРОВАТЬ: Кроме того, как получитьуказатель функции MyFunc в temp2.hh?

ОТВЕТ @ rafix07 в комментариях.Оба подхода работают так, как показано ниже.

#include "temp.hh"

// The following 2 lines are needed only for the second approach
template<class T11,class T22>
using PtrMem = void (MyClass<T11,T22>::*)(T11&,T22) const;

template <typename T1, typename T2>
void TEST_OP2(MyClass<T1,T2> *mc)
{
    T1 a = 3;
    T2 b = 7;
    // The following 3 lines show how the first approach works
    // typedef void (MyClass<T1,T2>::*ptrMem)(T1&,T2) const; 
    // ptrMem pmem = &MyClass<T1,T2>::template MyFunc<false>; 
    // (mc->*pmem)(a,b);

    // The following 2 lines show how the second approach works
    PtrMem<T1,T2> pmem = &MyClass<T1,T2>::template MyFunc<false>;
    (mc->*pmem)(a,b);
}

1 Ответ

0 голосов
/ 22 декабря 2018

mc является зависимым именем, вам нужно использовать template, если вы хотите вызвать шаблонный метод для mc:

mc->template MyFunc<false>(a, b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...