Operator << friend function and patterns

This is my code:

mov.h

 #include <iostream> template< class T> class Movie { public: Movie(T in) { a = in; } friend std::ostream& operator<<(std::ostream& os, const Movie<T>& movie); private: T a; }; template<class T> std::ostream& operator<<(std::ostream& os, const Movie<T>& movie) { return os; } 

main.cpp

 #include "mov.h" int main() { Movie<int> movie1(1); std::cout << movie1 << std::endl; return 0; } 

I try to compile this code and I get an error message:

 Error 1 error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Movie<int> const &)" ( [email protected] [email protected] [email protected] @ [email protected] @@ [email protected] @ [email protected] [email protected] @@@Z) referenced in function _main c:\Users\Adi\documents\visual studio 2013\Projects\bdika01\bdika01\main.obj bdika01 Error 2 error LNK1120: 1 unresolved externals c:\users\adi\documents\visual studio 2013\Projects\bdika01\Debug\bdika01.exe 1 1 bdika01 

If I try inline code like this, ok:

mov.h

  #include <iostream> template<class T> class Movie { public: Movie(T in) { a = in; } friend std::ostream& operator<<(std::ostream& os, const Movie<T>& movie){ return os; } private: T a; }; 

What if I want to separate the protection and the announcement?

Thanks.

+6
source share
1 answer
 template <typename T> class Movie; template<class T> std::ostream& operator<<(std::ostream& os, const Movie<T>& movie); template< class T> class Movie { friend std::ostream& operator<< <T>(std::ostream& os, const Movie<T>& movie); }; template<class T> std::ostream& operator<<(std::ostream& os, const Movie<T>& movie){ return os; } 

In your source code, you will make friends with a non-template function that simply accepts the correct instantiation of Movie<> as a parameter. Thus, each time a Movie<T> , a corresponding non- operator<< declared (but not defined) in the namespace scope. friend ads are weird in this way.

In addition, you declare and define a function template called operator<< (which is not a friend of any Movie instance). However, overload resolution prefers non-templates; other things are equal.

+6
source

Source: https://habr.com/ru/post/973788/


All Articles