我使用三个不同的文件来定义模板化的类。类声明位于.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
有人对如何解决这个问题有任何建议吗?我试图简化下面的代码。
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;
};
#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>*);
#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"
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> *);
答案 0 :(得分:2)
我认为这应该是工作
template<class T>
class MyClass;
template <class T>
T doSomething( const MyClass<T> *, T, int);
template<class T>
class MyClass {
friend T doSomething<T>( const MyClass<T> *, T, int);
public:
...
private:
T *m_pMyMatrix;
};
也就是说,您需要先声明模板,然后才能使模板(或其实例)成为朋友。
答案 1 :(得分:2)
我想我解决了这个问题:
的 mymethod.h 强> 的
template<class T> class MyClass;
template<class T>
T doSomething<T>(const MyClass<T>* pData, T val, int index);
的 myclass.h 强> 的
#include "mymethod.h"
template<class T>
class MyClass {
friend T doSomething<T>(const MyClass<T>* pData, T val, int index);
public:
// ...
private:
T *m_pMyMatrix;
};
的 mymethod.cpp 强> 的
#include "myclass.h"
template<class T>
T doSomething(const MyClass<T>* pData, T val, int index)
{
pData->m_pMyMatrix[index]+=val;
return pData->m_pMyMatrix[index];
}
template<> float doSomething( const MyClass<float> *, float, int);
template<> double doSomething( const MyClass<double> *, double, int);
在实践中,您唯一需要的是在 MyClass定义之前声明模板函数。