第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

訪問類中定義的好友功能

訪問類中定義的好友功能

C++
開滿天機 2019-12-16 16:12:09
有這樣的代碼:#include <iostream>class A{public:    friend void fun(A a){std::cout << "Im here" << std::endl;}    friend void fun2(){ std::cout << "Im here2" << std::endl; }    friend void fun3();};void fun3(){    std::cout << "Im here3" << std::endl;}int main() {      fun(A()); // works ok    //fun2(); error: 'fun2' was not declared in this scope    //A::fun2(); error: 'fun2' is not a member of 'A'    fun3(); // works ok} 如何訪問函數(shù)fun2()?
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

class A{


public:

    friend void fun(A a){std::cout << "Im here" << std::endl;}

    friend void fun2(){ std::cout << "Im here2" << std::endl; }

    friend void fun3();

};

雖然你的定義fun2 確實定義了一個“全球性”的功能,而不是一個成員,并使它成為friend的A同時,仍然丟失了一些在全球范圍內本身相同功能的聲明。


這意味著該范圍內的任何代碼都不fun2存在任何想法。


發(fā)生相同的問題fun,因為依賴于參數(shù)的查找可以接管并找到該函數(shù),因為存在類型為的參數(shù)A。


我建議改為以通常的方式定義函數(shù):


class A {

   friend void fun(A a);

   friend void fun2();

   friend void fun3();

};


void fun(A a) { std::cout << "I'm here"  << std::endl; }

void fun2()   { std::cout << "I'm here2" << std::endl; }

void fun3();

現(xiàn)在注意,一切正常(除了fun3因為我從未定義過)。



查看完整回答
反對 回復 2019-12-17
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

您可以調用的原因fun是,類內的friend聲明A僅通過依賴于參數(shù)的查找使其可見。否則,朋友聲明不會使它們聲明的函數(shù)在出現(xiàn)的類范圍之外自動可見。


您需要在名稱空間范圍內或內部添加聲明,main以使其fun2在中可見main。


例如


void fun2();

fun3在內部可見,main因為其定義(在類外部)也是一個聲明,使它可以從看到main。


ISO / IEC 14882:2011 7.3.1.2:


直到通過在名稱空間范圍中提供匹配的聲明(在授予友誼的類定義之前或之后),才可以通過非限定查找(3.4.1)或限定查找(3.4.3)找不到朋友的名稱。


3.4.2(依賴于參數(shù)的名稱查找)/ 4:


在關聯(lián)類中聲明的任何命名空間范圍的好友函數(shù)或好友函數(shù)模板在其各自的命名空間中都是可見的,即使它們在普通查找(11.3)中不可見。



查看完整回答
反對 回復 2019-12-17
  • 3 回答
  • 0 關注
  • 425 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號