C ++의 C ++ 20 표준까지 템플릿 클래스의 개인 멤버를 사용하는 클래스 외 연산자를 정의하려면 다음과 유사한 구문을 사용합니다.
template <typename T>
class Foo;
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs);
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
int main() {
return 1 == Foo<int>(1) ? 0 : 1;
}
그러나 C ++ 20 이후 클래스 외부 선언을 생략하여 순방향 선언을 생략 할 수 있으므로 다음과 같이 해결할 수 있습니다.
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
이제 제 질문은 C ++ 20의 어떤 부분에서 그렇게 할 수 있습니까? 그리고 왜 이전 C ++ 표준에서 이것이 가능하지 않았습니까?
주석에서 지적했듯이 clang은 데모에 표시된이 코드를 허용하지 않으므로 실제로 gcc의 버그 일 수 있습니다.
gcc의 bugzilla에 버그 보고서 를 제출했습니다
"c string" == Foo<std::string>("foo")
)을 피합니다.