我面臨的情況是出現了兩個有關ADL和模板功能專業化在某些情況下如何工作的問題。模板函數在類模板中的明確的朋友專業化
爲什麼我不能用COUT朋友專業化的定義裏面? 在這種情況下我收到一個鏈接錯誤,指出
basic_stream
未定義,但如果我切換到調用cat
編譯繼續。template<class T> void func1(T&){ ... } void cat(){ cout << "foo.func1" <<endl; } namespace first{ template<class R> struct foo{ friend void func1<>(foo<int>&){ cout << "foo.func1" <<endl; // cat(); } }; } foo<int> f; func1(f);
爲什麼ADL當我改變專業化指模板類PARAM不適? 如果我對ADL技工沒有任何錯誤,爲了解決
func1
在3中調用的正確版本(例如global(1)或friend defined one(2)),它會收集所有可能的匹配並選擇最具體的一。而且,我認爲最具體的一個是版本func1
,因爲不是將函數參數指定爲完全依賴於模板參數,而是指定具體類型foo
,其中func1
不在1中,但ADL選擇func1
無論如何。這是爲什麼 ?template<class T> void func1(T&){ // 1 ... } namespace first{ template<class R> struct foo{ friend void func1<>(foo<R>&){ // 2 cout << "foo.func1" <<endl; } }; } foo<int> f; func1(f); // 3
你的意思是'第一:: foo的 F; '? –
aschepler
我不認爲這段代碼有效。我得到了「錯誤:在朋友聲明中定義顯式專門化'func1'」。 http://coliru.stacked-crooked.com/a/728b83afb9b416a4 – aschepler
代碼不應該編譯,你使用的編譯器是什麼? – Barry