我正在尝试找到一种方法,使该函数成为给定类的朋友。该函数是另一类的方法,并且是模板的专门化。不经过专门化,我在Visual Studio中具有以下compiling代码:
ClassA.h:
#pragma once
#include "classB.h"
class A
{
private:
int data;
void Operate();
public:
A();
~A();
template<class T> friend void B::DoSomething(const T& arg);
};
ClassB.h:
#pragma once
class B
{
private:
int data;
template<typename T> void DoSomething(const T& arg)
{
T copy = arg;
copy.Operate();
data = 3;
};
/*
template<> void DoSomething(const A& arg)
{
A copy = arg;
copy.Operate();
data = 4;
};
*/
public:
B();
~B();
};
ClassA.cpp:
#include "classA.h"
A::A()
{
data = 1;
}
A::~A()
{
}
void A::Operate()
{
data = 2;
}
ClassB.cpp:
#include "classB.h"
B::B()
{
data = 1;
}
B::~B()
{
}
我如何专门化模板并使其成为朋友而不是整个模板?如果可能的话,我应该放在哪里?我在任何地方都需要转发声明吗?我需要包括哪些标题,等等?
我试图在classB.h中取消注释该块,并在其顶部添加#include "classA.h"
。我还尝试用template<class T> friend void B::DoSomething(const T& arg);
之类的内容替换classA.h中的template<> friend void B::DoSomething(const A& arg);
行。没有任何帮助。它拒绝编译。
我将不胜感激!
使B::DoSomething<int>
成为A
的朋友,请使用
friend void B::template DoSomething<int>(const int& arg);
使B::DoSomething<A>
成为A
的朋友,请使用
friend void B::template DoSomething<A>(const A& arg);
[请注意,为了做到这一点,DoSomething
必须是public
的B
成员。
进一步阅读:Where and why do I have to put the "template" and "typename" keywords?