如何使专用函数模板成为某个类的朋友?



我正在尝试找到一种方法来使函数成为给定类的好友。该函数是另一个类的方法,是模板的专用化。在没有专业化的情况下,我在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必须是Bpublic成员。

延伸阅读:我必须在哪里以及为什么必须放置"模板"和"类型名称"关键字?

最新更新