C++ Logo

STD-DISCUSSION

Advanced search

Subject: Re: Friend template operator declaration.
From: Vladimir Grigoriev (vlad.moscow_at_[hidden])
Date: 2021-04-22 01:49:15


Bo, I provided a reference that says about deduced template specialization. It is the case. That is if in a friend declaration there is used a qualified name (not a template-id) and a corresponding template declaration is found then the friend declaration is a templated specialization.
 
 
You can meet me at http://cpp.forum24.ru/ or www.stackoverflow.com or http://ru.stackoverflow.com
 
 
>Четверг, 22 апреля 2021, 9:34 +03:00 от Bo Persson via Std-Discussion <std-discussion_at_[hidden]>:
> 
>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> & );
>
>
>
>
>--
>Std-Discussion mailing list
>Std-Discussion_at_[hidden]
>https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion
 



STD-DISCUSSION list run by std-discussion-owner@lists.isocpp.org

Older Archives on Google Groups