我正在尝试找到一种使函数成为给定类的朋友的方法。该函数是另一类的方法,并且是模板的专门化。没有专门化,我在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必须是publicB成员。

进一步阅读:Where and why do I have to put the "template" and "typename" keywords?

关于c++ - 如何使专业功能模板成为某个类(class)的 friend ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58192619/

10-10 13:05