Как сделать так, чтобы шаблон участника был знаком с другом в VC7

Я пытаюсь сделать функцию-член-шаблон, объявленную в не-шаблонном базовом классе, другом производного класса. Оба метода объявления этого работают с использованием Visual Studio 2012. Однако Visual Studio 2003 жалуется с ошибками ниже. В качестве обходного пути я объявляю базовый класс своим другом, но я бы хотел этого избежать.
Это ограничение VS2003 или есть другой способ?

template<class T> friend CBase* CBase::Make() const;

а также

friend CBase* CBase::Make<CChild>() const;

Контекст:

#include "stdafx.h"
#include <string.h>
#include <iostream>

class CBase
{
public:
virtual CBase* MakeSameObj() = 0;
const std::string& Get() const { return data; }

CBase() { data += __FUNCSIG__; }

protected:
template<class T>
CBase* Make() const
{
CBase* pt = new T(__FUNCSIG__);
return pt;
}

std::string data;
};

class CChild
: public CBase
{
public:
CChild() : CBase() { data += " "; data += __FUNCSIG__; }
private:
CChild(char* param) : CBase() { data += " "; data += param; }
CBase* MakeSameObj() { return Make<CChild>(); }

//error C2245: non-existent member function 'Make' specified as friend (member function signature does not match any overload)
template<class T> friend CBase* CBase::Make() const;

//error C2768: 'CBase::Make' : illegal use of explicit template arguments
friend CBase* CBase::Make<CChild>() const;
//Ok
};int _tmain(int argc, _TCHAR* argv[])
{
CBase* pt  = new CChild;
CBase* pt1 = pt->MakeSameObj();

std::cout << pt->Get().c_str() << std::endl;
std::cout << pt1->Get().c_str() << std::endl;
return 0;
}

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]