Я использую три разных файла для определения шаблонного класса.Объявление класса находится в файле .h
, реализация в файле .cpp
и явные экземпляры включены в файл .inc
.Я пытаюсь определить функцию друга, которая может получить доступ к закрытым данным членов шаблонного класса.Как и в случае шаблонных классов, функция будет определена, реализована и реализована в 3 отдельных файлах.Когда я пытаюсь вызвать функцию, я получаю следующие сообщения об ошибках:
myclass.h:error: ‘doSomething’ is neither function nor member function; cannot be declared friend
myclass.h:error: expected ‘;’ before ‘<’ token
mymethod.h: error: ‘friend’ used outside of class
Кто-нибудьесть какие-либо предложения о том, как решить эту проблему?Я попытался упростить код ниже.
myclass.h
template<class T>
class MyClass{
friend T doSomething<T>( MyClass<T> *, T, int);
friend MyClass<T> * doSomethingElse<T>( const MyClass<T> *, const MyClass<T> *);
public:
...
private:
T *m_pMyMatrix;
};
mymethod.h
#include <myclass.h>
template <class T> friend T doSomething( MyClass<T> *, T, int);
template <class T> MyClass<T>* doSomethingElse(const MyClass<T>*, const MyClass<T>*);
mymethod.cpp
#include <mymethod.h>
template <class T>
T doSomething( MyClass<T> * pData, T val, int index){
// the actual code does sth. more complex than the code below.
pData->m_pMyMatrix[index]+=val;
return pData->m_pMyMatrix[index];
}
template <class T>
MyClass<T>* doSomethingElse(const MyClass<T> * pData1, const MyClass<T> * pData2){
...
T res1 = doSomething(pData1, val1, index1);
...
}
#include "mymethod-impl.inc"
mymethod-impl.inc
template float doSomething( MyClass<float> *, float, int);
template double doSomething( MyClass<double> *, double, int);
template MyClass<float>* doSomethingElse(const MyClass<float>*, const MyClass<float>*);
template MyClass<double>* doSomethingElse(const MyClass<double>*, const MyClass<double> *);