C++ Logo

std-discussion

Advanced search

Re: Friend template operator declaration.

From: Bo Persson <bo_at_[hidden]>
Date: Thu, 22 Apr 2021 08:33:27 +0200
On 2021-04-21 at 23:21, Vladimir Grigoriev via Std-Discussion wrote:
> The following program does not compile in MS Visual Studio 19.
>
> |#include <iostream> #include <string> template <typename T> class A;
> template <typename T> std::ostream &operator <<( std::ostream &, const
> A<T> & ); template <typename T> class A { private: T x; public: A( const
> T &x ) : x( x ) {} friend std::ostream &::operator <<( std::ostream &,
> const A<T> & ); }; template <typename T> std::ostream &operator <<(
> std::ostream &os, const A<T> &a ) { return os << "a.x = " << a.x; } int
> main() { std::cout << A<std::string>( "Hello" ) << '\n'; } |
>
> The compiler says that operator << is not a function.
>
> While the following program
>
> |#include <iostream> #include <string> template <typename T> class A;
> template <typename T> std::ostream &f( std::ostream &, const A<T> & );
> template <typename T> class A { private: T x; public: A( const T &x ) :
> x( x ) {} friend std::ostream &::f( std::ostream &, const A<T> & ); };
> template <typename T> std::ostream &f( std::ostream &os, const A<T> &a )
> { return os << "a.x = " << a.x; } int main() { f( std::cout,
> A<std::string>( "Hello" ) ) << '\n'; } |
>
> compiles successfully.
>
> What is the reason of that the first program does not compile? Is it a
> bug of MS Visual Studio 19 or do I have missed something from the C++ 20
> Standard?
>
> You can meet me at http://cpp.forum24.ru/ or www.stackoverflow.com or
> http://ru.stackoverflow.com
>

I don't know the exact rule, but note that the friend is not a template,
while the global operator is.

MSVC accepts the code if you change it to

     template<typename U>
     friend std::ostream &::operator <<( std::ostream &, const A<U> & );

Received on 2021-04-22 01:33:44