Sun Studio에서 템플릿 클래스에 템플릿 클래스를 제공하는 데 문제가 있습니다. 이 코드는 GNU G ++ (4.4.1 및 4.4.3)에서 제대로 컴파일되지만 Sun Studio C++ (5.9 SunOS_sparc 패치 124863-01 2007/07/25)에서는 실패합니다.템플릿 클래스의 템플릿 친구가 Sun Studio C++에서 실패 함
// Forward declarations
template<class T> class M;
template<class T> void f(M<T>, M<T>);
// Define M<T>
template<class T>
class M
{
public:
void f(M<T>) { }
friend void ::f<>(M<T>, M<T>);
};
// Define global function f
template<class T>
void f(M<T> a, M<T> b)
{
a.f(b);
}
M<int> a;
내가 CC -c -o t3.o t3.cpp
를 통해 컴파일하려고, 나는 다음과 같은 오류 메시지가 얻을 :
"t3.cpp", line 12: Warning: A friend function with template-id name must have a template declaration in the nearest namespace.
"t3.cpp", line 22: Where: While specializing "M<int>".
"t3.cpp", line 22: Where: Specialized in non-template code.
"t3.cpp", line 12: Error: Global scope has no declaration for "f".
"t3.cpp", line 22: Where: While specializing "M<int>".
"t3.cpp", line 22: Where: Specialized in non-template code.
1 Error(s) and 1 Warning(s) detected.
이것이 ++ 썬 스튜디오 C의 문제인가, 또는 여기에
는 최소한의 예입니다 C++이 유효하지 않습니까? (여전히 GCC에서 허용되며-Wall -pedantic
과 함께 경고가 표시되지 않습니다)? 코드를 변경하여 GCC와 Sun Studio에서 모두 표준을 따르고 컴파일 할 수있는 우아한 방법이 있습니까?
미리 감사드립니다.
그것의 선 스튜디오에 문제가, 그것이 아주 나빴어. 부스트 소스를 보면 상황을 해결하는 방법에 대한 많은 아이디어가 있습니다. – PlasmaHH
감사합니다. 그런 다음 부스트 소스를 확인해 보겠습니다. – felix
나는 부스트 소스에서 약간의 브라우징을 해왔다.이 문제를 해결하는 가장 효과적인 방법은'# ifdef'를 사용하는 것이다 : Sun Studio (그리고 이것이 작동하지 않는 다른 컴파일러)에서 간단하게 필요한 것들을'protected' 나'private' 대신'public'으로 만들고'friend' 문을 제거합니다. – felix