我有一个基类类似于下面的代码。 我试图超载<<用于cout。 但是,g ++说: base.h:24: warning: friend declaration 'std::ostream& operator<<(std::ostream&, Base<T>*)' declares a non-template function base.h:24: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning 我已经尝试在类声明/原型之后添加<>。 但是,然后我得到它does not match any template declaration 。 我一直在试图让运营商的定义完全模板化(我想),但我只能得到它与以下代码,手动实例化运营商。 base.h […]
为什么C ++有任何人都可以调用的public成员和friend声明, 这些声明将所有 private成员公开给定的外部类或方法,但是没有提供给给定调用者公开特定成员的语法? 我想用一些例程来表示接口,只能由已知的调用者调用,而不必让这些调用者完全访问所有的私有,感觉这是一个合理的想法。 最好的我可以自己(下)和其他人的build议到目前为止围绕不同的间接性的习语/模式,我真的只想要一个单一的 ,简单的类定义,明确指出什么来电者(比我更细) , 我的孩子 ,或绝对任何人 )可以访问哪些成员。 以下expression概念的最佳方式是什么? // Can I grant Y::usesX(…) selective X::restricted(…) access more cleanly? void Y::usesX(int n, X *x, int m) { X::AttorneyY::restricted(*x, n); } struct X { class AttorneyY; // Proxies restricted state to part or all of Y. private: void restricted(int); // Something preferably selectively […]
可能重复: 什么时候应该在C ++中使用“朋友”? 我在刷C ++(我是一个Java开发人员),偶然遇到了我忘记的friend class关键字。 这些function之一就是厨房水槽的一部分,还是有一个很好的理由,而不仅仅是一个香草吸气? 我了解它的不同之处在于它限制了谁可以访问这些数据,但是我不能想到这是必要的。 注意:我已经看到了一个类似的问题,但具体而言,我问,这只是一个高级function,除了让人们看着你的代码感到困惑,直到他们意识到你在做什么之外,没有增加真正的价值。
假设我有一个F类,它应该是类G (在全局命名空间)和C (在命名空间A )中的朋友。 要成为A::C朋友, F必须被转发声明。 对G朋友,没有F前向声明是必要的。 同样,类A::BF可以成为A::C朋友,无需前向声明 下面的代码演示了这一点,并用GCC 4.5,VC ++ 10和至less另外一个编译器编译。 class G { friend class F; int g; }; // without this forward declaration, F can't be friend to A::C class F; namespace A { class C { friend class ::F; friend class BF; int c; }; class BF { public: BF() { […]
在C ++中,我经常把一个unit testing类作为我正在testing的类的一个朋友。 我这样做是因为我有时觉得需要编写一个私有方法的unit testing,或者我想访问一些私有成员,这样我可以更容易地设置对象的状态,所以我可以testing它。 对我来说,这有助于保持封装和抽象,因为我不修改该类的公共或受保护的接口。 如果我购买第三方库,我不希望它的公共接口受到一些公共方法的污染,我不需要知道,因为供应商想unit testing! 我也不需要担心一群受保护的成员,如果我从一个class级inheritance,我不需要知道这些成员。 这就是为什么我说它保留了抽象和封装。 在我的新工作中,他们甚至对unit testing也不喜欢使用朋友class。 他们说,因为class级不应该“知道”有关testing的任何事情,而且你不希望class级与testing紧密结合。 有人可以向我解释这些原因,以便我可以更好地理解? 我只是不明白为什么使用朋友进行unit testing是不好的。
如果我在C ++中定义一个内部类,它是否会自动成为包含它的类的一个朋友? 例如,这是合法的: class Outer { public: class Inner { public: void mutateOuter(Outer& o); }; private: int value; }; void Outer::Inner::mutateOuter(Outer& o) { o.value ++; // Legal? Or not? } 我问,因为在我试过的一些编译器(VS2003)这个代码将无法正常工作,但是我至less听说过它在一些编译器上工作。 我在C ++规范中找不到关于这个的相关章节,如果任何人都可以引用某个特定的东西来说明它是合法的或者不合法的,那就太好了。
有人告诉我,在class级的公共或私人领域宣布一个朋友class是有区别的,但我似乎无法find关于这个在线的任何东西,我不知道他们知道他们在说什么。 我的意思是区别: class A { public: friend class B; }; 和 class A { private: //or nothing as the default is private friend class B; }; 有区别吗?
在复制和交换成语的美丽答案有一段代码,我需要一点帮助: class dumb_array { public: // … friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // … }; 他又加了一张纸条 还有其他的说法,我们应该专门为我们的typesstd :: swap,提供一个在一个自由function交换,一个类交换,但这是不必要的:任何正确使用交换将通过一个非限定的调用,我们的function将通过ADLfind。 一个function就可以了。 和friend我有点“不友好”的说法,我必须承认。 所以,我的主要问题是: 看起来像一个免费的function ,但它的内部类体呢? 为什么不是这个swap静态 ? 它显然不使用任何成员variables。 “任何适当的交换使用将通过ADLfind交换” ? ADL将search命名空间,对吗? 但是,它也看内部类? 或者在这里friend进来? 副题: 用C ++ 11,我应该用noexcept标记我的swap吗? 用C ++ 11和它的范围 ,我应该把friend iter begin()放在friend iter begin()和friend […]
如果我有三个class,A,B,C,A和B是朋友(双向)。 另外,B和C是朋友(双向)。 A有一个指向B的指针,B有一个指向C的指针。为什么不能通过指针访问C的私有数据? 只是澄清:这是一个纯粹的理论C ++语言问题,而不是一个devisebuild议的问题。
我想要做以下事情: template <typename T> struct foo { template <typename S> friend struct foo<S>; private: // … }; 但我的编译器(VC8)扼杀它: error C3857: 'foo<T>': multiple template parameter lists are not allowed 我想所有的T所有可能的实例template struct foo朋友foo<T> 。 我该如何做这项工作? 编辑:这个 template <typename T> struct foo { template <typename> friend struct foo; private: // … }; 似乎编译,但它是正确的? 朋友和模板有非常不自然的语法。