определение функции друга в шаблонном классе - PullRequest
1 голос
/ 26 ноября 2010

Я использую три разных файла для определения шаблонного класса.Объявление класса находится в файле .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> *);

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Мне кажется, я решил это:

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.

2 голосов
/ 26 ноября 2010

Я думаю, что это должно работать

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;
};

То есть вам нужно объявить шаблон, прежде чем вы сможете сделать его (или его экземпляр) другом.

...