草庐IT

c++ - 为什么标准禁止部分特化的友元声明?

C++标准禁止部分特化的友元声明。(§14.5.3/8):Frienddeclarationsshallnotdeclarepartialspecializations.[Example:templateclassA{};classX{templatefriendclassA;//error};--endexample]其他问题,例如thisone,已收到援引此禁令的答复,但我想知道理由。我没有看到它,也无法用我最喜欢的搜索引擎找到它。我但是可以发现它可以追溯到C++98标准,所以大概基本原理很明确。谁能给我解释一下? 最佳答案 我

c++ - 为什么标准禁止部分特化的友元声明?

C++标准禁止部分特化的友元声明。(§14.5.3/8):Frienddeclarationsshallnotdeclarepartialspecializations.[Example:templateclassA{};classX{templatefriendclassA;//error};--endexample]其他问题,例如thisone,已收到援引此禁令的答复,但我想知道理由。我没有看到它,也无法用我最喜欢的搜索引擎找到它。我但是可以发现它可以追溯到C++98标准,所以大概基本原理很明确。谁能给我解释一下? 最佳答案 我

c++ - 将 constexpr 特化声明为 friend

我有一个模板类A和一个模板函数f返回A对象。我要f成为A的friend仍然是constexprtemplateclassA;templateconstexprAf();//fisafriendofAtemplateclassA{friend/*constexpr?*/Af();constexprA(){}};templateconstexprAf(){return{};}intmain(){constexprautoa=f();}我无法让clang和gcc就这里的内容达成一致。如果我不放constexpr在friend声明中,gcc工作正常,但clang不会编译它,错误如下:main.

c++ - 将 constexpr 特化声明为 friend

我有一个模板类A和一个模板函数f返回A对象。我要f成为A的friend仍然是constexprtemplateclassA;templateconstexprAf();//fisafriendofAtemplateclassA{friend/*constexpr?*/Af();constexprA(){}};templateconstexprAf(){return{};}intmain(){constexprautoa=f();}我无法让clang和gcc就这里的内容达成一致。如果我不放constexpr在friend声明中,gcc工作正常,但clang不会编译它,错误如下:main.

c++ - 为什么可以将友元函数定义放在类定义中?

友元函数不应该在类之外显式定义吗?如果是这样,为什么我可以像任何成员函数一样在类定义中声明友元函数?这是什么?是否仅适用于某些运算符,例如运营商还是适用于所有运营商?如果适用于所有这些,这样做有什么缺点吗?应该避免吗?如果是,为什么?classperson{public:booloperator更新:我不是要求选择非成员运算符重载或成员运算符重载。我想知道的是:为什么允许我们在类定义中移动友元方法的定义?。不违反什么吗?如果不是,为什么我们首先要有friend?我们可以简单地将重载定义为成员函数(我知道成员函数的局限性)但我是说知道这一点,为什么编译器不提示我没有在类定义之外定义友元函

c++ - 为什么可以将友元函数定义放在类定义中?

友元函数不应该在类之外显式定义吗?如果是这样,为什么我可以像任何成员函数一样在类定义中声明友元函数?这是什么?是否仅适用于某些运算符,例如运营商还是适用于所有运营商?如果适用于所有这些,这样做有什么缺点吗?应该避免吗?如果是,为什么?classperson{public:booloperator更新:我不是要求选择非成员运算符重载或成员运算符重载。我想知道的是:为什么允许我们在类定义中移动友元方法的定义?。不违反什么吗?如果不是,为什么我们首先要有friend?我们可以简单地将重载定义为成员函数(我知道成员函数的局限性)但我是说知道这一点,为什么编译器不提示我没有在类定义之外定义友元函

c++ - 将命名空间声明为类的 friend

我想知道是否有一种方法可以使我们在特定命名空间friend中定义的所有函数都带有一个类?特别是我有一个类,例如:classC{private://...public://...friendC*B::f1(C*);friendC*B::f2(C*);friendC*B::f3(C*);friendC*B::f4(C*);friendC*B::f5(C*);};和一个命名空间B为:namespaceB{C*f1(C*x);C*f2(C*x);C*f3(C*x);C*f4(C*x);C*f5(C*x);};现在,我宁愿避免在类定义中写5行,以使命名空间B的所有五个函数与类C成为friend,

c++ - 将命名空间声明为类的 friend

我想知道是否有一种方法可以使我们在特定命名空间friend中定义的所有函数都带有一个类?特别是我有一个类,例如:classC{private://...public://...friendC*B::f1(C*);friendC*B::f2(C*);friendC*B::f3(C*);friendC*B::f4(C*);friendC*B::f5(C*);};和一个命名空间B为:namespaceB{C*f1(C*x);C*f2(C*x);C*f3(C*x);C*f4(C*x);C*f5(C*x);};现在,我宁愿避免在类定义中写5行,以使命名空间B的所有五个函数与类C成为friend,

c++ - 为什么我不能通过 typedef 声明 friend ?

有谁知道为什么类名的typedef不像friend声明的类名那样工作?classA{public:};classB:publicA{public:typedefASUPERCLASS;};typedefAX;classC{public:friendclassA;//OKfriendclassX;//failsfriendclassB::SUPERCLASS;//fails}; 最佳答案 目前不能。我还不知道原因(只是查找它,因为我觉得它很有趣)。更新:您可以在第一个提案中找到支持typedef-names作为好友的原因:http:/

c++ - 为什么我不能通过 typedef 声明 friend ?

有谁知道为什么类名的typedef不像friend声明的类名那样工作?classA{public:};classB:publicA{public:typedefASUPERCLASS;};typedefAX;classC{public:friendclassA;//OKfriendclassX;//failsfriendclassB::SUPERCLASS;//fails}; 最佳答案 目前不能。我还不知道原因(只是查找它,因为我觉得它很有趣)。更新:您可以在第一个提案中找到支持typedef-names作为好友的原因:http:/