重载 << 运算符函数:未解决的外部符号错误

overloaded << operator function : unresolved external symbol error

我重载了 << 运算符来打印 class 的指针成员中的地址。但是,它会抛出以下错误(使用 Visual Studio 2017)。使用正常的 class 方法即可完成工作。

有线索吗?

错误:

error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl IntroSmartPointers::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class IntroSmartPointers::AutoPtr<class IntroSmartPointers::Resource> const &)" (??6IntroSmartPointers@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AEAV12@AEBV?$AutoPtr@VResource@IntroSmartPointers@@@0@@Z) referenced in function "void __cdecl IntroSmartPointers::main(void)" (?main@IntroSmartPointers@@YAXXZ)

代码:

#include <iostream>

using namespace std;

namespace SmartPointers {
    template<class T>
    class AutoPtr {
    private:
        T* m_ptr;

    public:
        // constructor
        AutoPtr(T* ptr = nullptr)
            : m_ptr(ptr)
        {}

        // destructor
        ~AutoPtr() {
            delete m_ptr;
        }

        friend ostream& operator<<(ostream& out, const AutoPtr<T>& ptr);
    };

    template<class T>
    ostream& operator<<(ostream& out, const AutoPtr<T>& ptr) {
        out << ptr.m_ptr;
    }

    class Resource {
    public:
        Resource() { cout << "Resource(): acquired\n"; }
        ~Resource() { cout << "~Resource: destroying...\n"; }

        void sayHi() {
            cout << "Hi\n";
        }
    };
}

void main() {
    SmartPointers::AutoPtr<Resource> ptr{ new Resource{} };
    cout << ptr << endl;
}

您的 friend 声明了非模板运算符。
在这种情况下,您可以在 class 主体内定义一个友元函数,或者尝试以下操作:

template<typename T>
class AutoPtr {
  // ...


  template<typename U>
  friend ostream& operator<<(ostream& out, const AutoPtr<U>& ptr);
};

template<class T>
ostream& operator<<(ostream& out, const AutoPtr<T>& ptr) {
  out << ptr.m_ptr;
  return out; // You missed this part too
}

请参阅 https://en.cppreference.com/w/cpp/language/friend
中的 模板友元运算符 部分 main 应该 return int 而不是 void.