我面临的情况是出现了两个有关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