簡體   English   中英

來自多個班級的朋友模板功能

[英]Friending template function from multiple classes

我有這個代碼:

template<typename T> T f() {
// ...
}

class A {
    friend A f();
};

class B {
    friend B f();
};

我得到ambiguating new declaration of 'B f()'錯誤的ambiguating new declaration of 'B f()'

但是,如果我將我的代碼更改為以下

template<typename T> void f(T arg) {
// ...
}

class A {
    friend void f(A);
};

class B {
    friend void f(B);
};

程序編譯精細。

有人可以幫我弄清問題是什么?

friend A f();

該行聲明非模板函數A f()存在並且是該類的朋友。 這與f<A>() - 它是一個全新的功能。

friend B f();

此行聲明了另一個具有相同名稱但不同返回類型的非模板函數。 你不能重載函數的返回類型,所以這是禁止的。

這兩個朋友聲明都沒有引用你的模板函數,在你的第二個例子中,兩個朋友聲明仍然沒有引用先前聲明的模板函數; 它們引用了其他一些非模板函數,就像你的第一個例子中的朋友聲明一樣。

這可能是你的意思:

class A {
    friend A f<A>();
};

class B {
    friend B f<B>();
};

並且,修復你的第二個例子:

class A {
    friend void f<A>(A);
};

class B {
    friend void f<B>(B);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM