아, friend 함수 자체가 템플릿 함수로군요. 제 생각에 이 경우에는 오히려
링크 에러가 나야 맞는 것 같습니다. 위처럼 하면 test는 템플릿이 아닌
일반 함수라는 뜻이 됩니다. 그리고 그런 함수는 존재하지 않으므로 링크 에러가
나는 것이죠. 정확히 하려면 다음과 같이 해야 합니다.
template<typename T> class Tes; // 전방 선언
template<typename T> void test(Tes<T>&); // test가 템플릿임을 선언
template <class T>
class Tes
{
public:
T m_i;
friend void test<T>(Tes<T>& t);
// friend void test<>(Tes& t); 로 해도 됨
};
template <class T>
void test(Tes<T>& t)
{
t.m_i=10;
}
int main()
{
Tes<int> t1;
test(t1);
return 0;
}
그거 이상하군요. 원래는 돼야 하는데.볼랜드가 템플릿을 제대로 지원하
그거 이상하군요. 원래는 돼야 하는데.
볼랜드가 템플릿을 제대로 지원하지 않기 때문일지도 모르겠네요.
간략한 코드를 올리시든지 Comeau로 시험해 보시죠.
http://www.comeaucomputing.com/tryitout/
현재 표준에 가장 근접하다고 평가받는 컴파일러입니다.
예 comeau로 컴파일 해 보았는데 여기서는 에러 없이 잘 됩니다.
http://www.comeaucomputing.com/tryitout/
여기서 해보니 잘 되더라고요. 그리고 vc, gcc에서도 잘 되고요..
정말 볼랜드cpp에서 템플릿 부분이 정의가 잘 않되 있는지 모르겠습니다.
볼랜드컴파일에서 아래 소스를 돌려보면 에러가 납니다.
inline으로 하면 에러가 안나고요..
^에러: Unresolved external 'test(Tes<int>&)'
template <class T>
class Tes
{
public:
T m_i;
friend void test(Tes & t);
};
template <class T>
void test(Tes<T> & t)
{
t.m_i=10;
}
int main()
{
Tes<int> t1;
test(t1);
return 0;
}
아, friend 함수 자체가 템플릿 함수로군요. 제 생각에 이 경우에는
아, friend 함수 자체가 템플릿 함수로군요. 제 생각에 이 경우에는 오히려
링크 에러가 나야 맞는 것 같습니다. 위처럼 하면 test는 템플릿이 아닌
일반 함수라는 뜻이 됩니다. 그리고 그런 함수는 존재하지 않으므로 링크 에러가
나는 것이죠. 정확히 하려면 다음과 같이 해야 합니다.
댓글 달기