如何使专门的功能模板成为某个班级的朋友?

问题描述 投票:0回答:1

我正在尝试找到一种方法,使该函数成为给定类的朋友。该函数是另一类的方法,并且是模板的专门化。不经过专门化,我在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);行。没有任何帮助。它拒绝编译。

我将不胜感激!

c++ templates friend template-specialization
1个回答
0
投票

使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?

© www.soinside.com 2019 - 2024. All rights reserved.