2017-03-17 64 views
1

这似乎工作:为什么模板化的朋友函数似乎没有被暴露,如果它是在一个类中定义的?

template<class A> struct S { 
    template<class B> friend S<B> f(B); 
}; 

template<class B> S<B> f(B) {return S<B>{};} 

int main() { 
    f(5); 
} 

http://ideone.com/lApGTi

好了,让我们做一个看似纯粹的外观变化和f定义移动到struct的身体:

template<class A> struct S { 
    template<class B> friend S<B> f(B) {return S<B>{};} 
}; 

int main() { 
    f(5); 
} 

突然编译开始失败:

prog.cpp: In function ‘int main()’: 
prog.cpp:6:5: error: ‘f’ was not declared in this scope 
    f(5); 
    ^

http://ideone.com/ImsQtJ

为什么模板朋友函数需要在类的外部定义才能在此代码段中工作?

是否有任何技巧可以让函数f在类定义的主体中定义?

+0

看看副本中的第二个答案,它比第一个答案好。 – SergeyA

回答

1

当您在类内部实现内联函数时,其声明在类外部不可见,但不包含argument-dependent lookup

仅当类或其任何嵌套类使用friend函数时才有用。

常规类也存在这个问题,不仅仅是类模板。以下是一个问题。

struct S { 
    friend S f(int) {return S{};} 
}; 

int main() { 
    f(5); 
} 
+0

在这种情况下,为什么我们可以定义** inline **,例如'friend ostream&operator <<(ostream&os,myClass const&mc)'然后使用它:'cout << myClass {}'?如果内联定义,该运算符应该在'myClass'之外不可见,但我们仍然可以使用它? http://ideone.com/P7eNbl – gaazkam

+0

这适用于ADL。 –

+0

/我读取任何ADL是:) – gaazkam

相关问题