Dlaczego kod poniżej dobrze skompilowany w g ++, ale pojawia się błąd na klang?clang/g ++ różnica z funkcją znajomego
#include <iostream>
class Object {};
class Print
{
public:
template <typename CharT>
inline friend std::basic_ostream<CharT> & operator<<(std::basic_ostream<CharT> & out, const Object&)
{
return (out << "object");
}
static void f(const Object& str)
{
std::cout << str;
}
};
int main()
{
std::cout << Object() << std::endl;
return 0;
}
Kiedy przeniósł przyjaciela funkcję do globalnej przestrzeni nazw, dobrze skompilowany kod dla obu kompilatorów (clang++/g++).
Które wdrożenie w tym przypadku jest bardziej zgodne ze standardami C++?
Clang jest prawdopodobnie poprawne. Myślę, że jest to możliwy duplikat http: // stackoverflow.com/q/15745776/2073257 –
@DanielFrey w moim przypadku nawet ja usunąłem szablon i otrzymałem ten sam błąd: http://coliru.stacked-crooked.com/a/765458742bfcea4d – alexolut
N.B. GCC 5.0 odrzuca twój przykład. Myślę, że to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59366, którego naprawa została popełniona dwa dni temu. –