C++ 如何使用模板类函数
我试图将模板类中的一个特定函数声明为friendC++ 如何使用模板类函数,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
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;
}