我正在尝试找到一种方法来使函数成为给定类的好友。该函数是另一个类的方法,是模板的专用化。在没有专业化的情况下,我在Visual Studio中有以下编译代码:
A.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();
};
A类.cpp:
#include "classA.h"
A::A()
{
data = 1;
}
A::~A()
{
}
void A::Operate()
{
data = 2;
}
B类.cpp:
#include "classB.h"
B::B()
{
data = 1;
}
B::~B()
{
}
如何使模板专用化并使其成为朋友而不是整个模板?如果可能的话,我应该把它放在哪里呢?我需要在任何地方进行前向申报吗?我需要包含哪些标头等?
我试图取消注释classB.h中的块,并在它上面添加#include "classA.h"
。我还尝试将 classA.h 中的行template<class T> friend void B::DoSomething(const T& arg);
替换为类似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
必须是B
的public
成员。
延伸阅读:我必须在哪里以及为什么必须放置"模板"和"类型名称"关键字?