У меня есть файл заголовка со следующим, скажем 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);
}