C++ 使用friend访问模板化类中的私有变量
我从下面的程序中得到以下错误: 使用未声明的标识符“值” 为什么??还有,如何使用好友类修复它 提前谢谢C++ 使用friend访问模板化类中的私有变量,c++,templates,C++,Templates,我从下面的程序中得到以下错误: 使用未声明的标识符“值” 为什么??还有,如何使用好友类修复它 提前谢谢 template <typename T> class F2 : public F1<T> { public: F2(T o) : F1<T>(o) {} void fun() { std::cout << value << std::endl; } }; template <typename T>
template <typename T>
class F2 : public F1<T>
{
public:
F2(T o) : F1<T>(o) {}
void fun() {
std::cout << value << std::endl;
}
};
template <typename T>
class F1
{
public:
template <typename U>
friend class F2;
F1(T o) : value(o) {}
protected:
T value;
};
int main()
{
F2<int> f(3);
}
模板
F2类:公共F1
{
公众:
F2(to):F1(o){}
虚无乐趣(){
STD::CUT< P> C++标准规定,当分析模板函数时,不依赖模板参数的所有名称都被绑定,而不是在实例化时,否则可以检测到对继承的<代码>值< /代码>的引用。
快速解决方法是使用this->value
;因为this
依赖于模板参数,因此在实例化函数时它被绑定,因此允许引用继承的value
。这里有多个问题:
1) F2
没有模板化,因此在F2
中使用t
的任何地方都是不正确的
2) F1
(基类)在F2
之后定义,将F2
移动到F1
3) 基类与它的派生类是友好的。它不应该知道它的派生类
这是您的实际代码吗?如果是您编写的错误,则是您的实际错误吗?我认为会有很多错误,原因有很多。这是您的实际代码吗?F2
源于F1
,它在您的代码示例中位于它之后。是的,否则它会抱怨朋友不是一个精心设计的类型。@NiallC:可能有一个错误上面的转发声明。只有在模板使用后才有主体,只要主体在模板实例化时可用(在main()
内命名类型F2
)我没有注意到,但是我错过了第一行,那就是模板。我注意到了一些例子,我认为“this”有多余的用法。我现在知道它们为什么会出现。谢谢。