我正在尝试找到一种使函数成为给定类的朋友的方法。该函数是另一类的方法,并且是模板的专门化。没有专门化,我在Visual Studio中有以下编译代码:
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?
关于c++ - 如何使专业功能模板成为某个类(class)的 friend ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58192619/