C++ 如何使成员模板函数成为VC7中的好友

C++ 如何使成员模板函数成为VC7中的好友,c++,visual-studio-2012,visual-studio-2003,C++,Visual Studio 2012,Visual Studio 2003,我试图创建一个成员模板函数,在非模板基类中声明,它是派生类的朋友。使用Visual Studio 2012声明它的两种方法都有效。然而,VisualStudio2003抱怨如下错误。作为一种解决方法,我将基类声明为友元,但我希望避免这种情况。 这是VS2003的限制还是有其他方法 template<class T> friend CBase* CBase::Make() const; template friend CBase*CBase::Make()const; 及 frie

我试图创建一个成员模板函数,在非模板基类中声明,它是派生类的朋友。使用Visual Studio 2012声明它的两种方法都有效。然而,VisualStudio2003抱怨如下错误。作为一种解决方法,我将基类声明为友元,但我希望避免这种情况。 这是VS2003的限制还是有其他方法

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

friend CBase*CBase::Make()常量;
背景:

#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;
}
#包括“stdafx.h”
#包括
#包括
C类数据库
{
公众:
虚拟CBase*MakeSameObj()=0;
const std::string&Get()const{return data;}
CBase(){data+=\uuuu FUNCSIG\uuu;}
受保护的:
模板
CBase*Make()常量
{
CBase*pt=新的T(uu函数uu);
返回pt;
}
std::字符串数据;
};
儿童班
:公共CBase
{
公众:
CChild():CBase(){data+=“”;data+=\uuuuu FUNCSIG\uuuu;}
私人:
CChild(char*param):CBase(){data+=“”;data+=param;}
CBase*MakeSameObj(){return Make();}
//错误C2245:将不存在的成员函数“Make”指定为好友(成员函数签名与任何重载不匹配)
模板友元CBase*CBase::Make()常量;
//错误C2768:“CBase::Make”:非法使用显式模板参数
好友CBase*CBase::Make()常量;
//嗯
};
int _tmain(int argc,_TCHAR*argv[]
{
CBase*pt=新子女;
CBase*pt1=pt->MakeSameObj();
std::cout Get().c_str()
#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;
}