클래스 범위에 정의 된 친구 함수는 인수 종속 조회를 통해 찾을 수 있으므로 친구 함수 유형에는 클래스 유형을 사용해야하지만 클래스 외부에는 친구 함수를 정의하는 경우 함수 매개 변수는 비워 둘 수 있습니다. 템플릿 친구에게 이것이 어떻게 적용되는지, 클래스 외부의 특성화가있는 경우 클래스 범위 외부에서 정의 된 일반 친구 함수로 표시되어야합니다.친구 템플릿 인수 종속 조회
#include <iostream>
class A
{
public:
A()
: x(20)
{}
template <typename T>
friend void foo()
{
std::cout << "Primary Template" << std::endl;
}
friend void goo();
private:
int x;
};
void goo()
{
std::cout << "some goo" << std::endl;
}
template <>
void foo<int>()
{
std::cout << "specialization" << std::endl;
}
int main()
{
A a;
foo<int>(); // VS 2012 gives error C3767: 'foo': candidate function(s)
// not accessible
// 'foo' [may be found via argument-dependent lookup]
goo(); // OK
}
그렇다면 goo가 보이지 않고 액세스 할 수 있지만 int에 대한 foo의 특수화가 아닌 이유는 무엇입니까? VisualStudio 2012에서 " 'foo'오류가 발생했습니다 : 후보 함수를 액세스 할 수 없습니다. 'foo'[인수에 의존하는 조회를 통해 찾을 수 있습니다.] '. 그런데 GCC는 오류없이 코드를 컴파일합니다. 표준에 어떤 제한이 있습니까? 아니면 이것은 컴파일러의 문제입니까?
잘 작동 gcc 4.9.2 http://ideone.com/iYvJFM – Ankur
예 GCC가 오류없이 코드를 컴파일한다고 언급했습니다. –
흥미 롭습니다. 이것에 3.5 pukes를 clang. 특수화 이전에 ' void foo();'템플릿을 추가하면 clang, btw에 대한 수정 사항이 수정됩니다. 'A'의 선언이 충분하지 않은 것 같습니다 (gcc의 경우 너무 놀랍습니다). –
WhozCraig