Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用模板类函数_C++ - Fatal编程技术网

C++ 如何使用模板类函数

C++ 如何使用模板类函数,c++,C++,我试图将模板类中的一个特定函数声明为friend template <class T> class A { // Constructor, destructor, etc.. void update(); } // This is the function I'm trying to declare as a friend template <class T> void A<T>::update() { // Do stuff, a

我试图将模板类中的一个特定函数声明为friend

template <class T>
class A
{
    // Constructor, destructor, etc..

    void update();
}

// This is the function I'm trying to declare as a friend
template <class T> void A<T>::update()
{
    // Do stuff, accessing private members of B
}
我能够成功地将所有A声明为朋友:

// Forward declare at top
template class<T>
class A;

// Then inside of class B
template <class T> friend class A;
//在顶部向前声明
模板类
甲级;
//然后在B班里面
A类模板;
但是,我试图将对B的私有/受保护作用域的访问限制在A::update()内。请尝试以下操作:

template <class T>
class A
{
    void update();
};

class B
{
private:
    int asd;
    template <class T> friend void A<T>::update();
};

template <class T> void A<T>::update()
{
    B test;
    test.asd = 2;
}
模板
甲级
{
无效更新();
};
B类
{
私人:
int asd;
模板A::update();
};
模板无效A::update()
{
B试验;
test.asd=2;
}

这将编译,但我收到以下警告:
不支持友元类声明的依赖嵌套名称说明符“A::”;关闭对“B”[-Wunsupported friend]friend void A::update()的访问控制~~~~~~~~~~~~~~~~~~~^@btse尝试将B类定义放在更新方法定义之前,这对我很有用。在我得到和你一样的错误之前。对不起,我应该更清楚一点,这两个类是在不同的文件中定义的。类A包括类B的头文件,类B的文件具有模板类A的正向声明。@btse在大多数情况下,在处理模板时,最好将方法定义与其声明一起保存(在*.h文件中)。您应该阅读这篇文章:@marcias Template类A在单个头文件中声明和定义。类B在两个单独的文件中声明和定义。类B不是一个模板类,我只是想提供对a的update()函数的friend访问。出于好奇,为什么您希望
a::update()
的每个实例化都是
B
?@JustinTime的朋友,因为它使用了B中的一个私有函数。我不想不必要地将此函数公开,因为它只供A使用。不,我的意思是,为什么你想让每个
A::update()
都成为
B
的朋友,而不仅仅是(例如)
A::update()
B
是否明确要求允许每个
A::update()
自由统治,或者是否有可能将其缩小到只有一个或几个
T
s?无论哪种方式,它都以开头,并且代码本身是有效的。
template <class T>
class A
{
    void update();
};

class B
{
private:
    int asd;
    template <class T> friend void A<T>::update();
};

template <class T> void A<T>::update()
{
    B test;
    test.asd = 2;
}