代码之家  ›  专栏  ›  技术社区  ›  aliceangel

C++链接器错误LNK 2019未解析的外部符号引用在函数中

  •  -3
  • aliceangel  · 技术社区  · 8 年前

    在本文之后,我试图实现一个智能类

    https://www.codeproject.com/Articles/15351/Implementing-a-simple-smart-pointer-in-c

    我有一门课叫 .

    class Person
    {
        private:
            char* name;
            int age;
        public:
            Person();
            Person(const char* pName, int pAge);
            ~Person();
            void Display();
    };
    

    人cpp

    #include<iostream>
    #include "Person.h"
    
    Person::Person() : name(nullptr), age(0)
    {}
    
    Person::Person(const char* pName, int pAge) 
    {
          name = new char[std::strlen(pName) + 1];
          std::strcpy(name, pName);
          age = pAge;
    }
    
    Person::~Person()
    {}
    
    void Person::Display()
    {
         std::cout << "Name is " << name << " and age is " << age << std::endl;
    }
    

    参考计数。H

    #pragma once
    class ReferenceCount
    {
        private:
             int count;
        public:
            ReferenceCount();
            ~ReferenceCount();
            void AddRef();
            void DelRef();
    

    };

    参考计数。cpp

    #include "ReferenceCount.h"
    
    ReferenceCount::ReferenceCount() : count(0)
    {}
    
    ReferenceCount::~ReferenceCount()
    {}
    
    void ReferenceCount::AddRef()
    {
         count++;
    }
    
    void ReferenceCount::DelRef()
    {
        count--;
    }
    

    SmartClass。H

    #pragma once
    #include "ReferenceCount.h"
    
    template <typename T> class SmartClass
    {
       private:
           T* pData;
           ReferenceCount* rc;
       public:
           SmartClass();
           SmartClass(T* data);
           SmartClass(const SmartClass<T>& sp); // copy constructor
          ~SmartClass();
          T& operator*();
          T* operator->();
          SmartClass<T>& operator=(const SmartClass<T>& sp); // copy assignment operator
    };
    

    SmartClass。cpp

    #include "SmartClass.h"
    
    template <typename T>
    SmartClass<T>::SmartClass() : rc(0)
    {
        rc = new ReferenceCount();
        rc->AddRef();
    }
    
    template <typename T> 
    SmartClass<T>::SmartClass(T* data) : pData(data), rc(0)
    {
       rc = new ReferenceCount();
       rc->AddRef();
    }
    
    template<typename T>
    SmartClass<T>::SmartClass(const SmartClass<T>& sp)  // copy constructor
    {
      this->pData = sp.pData;
      this->rc = sp.rc;
    }
    
    template <typename T>
    SmartClass<T>::~SmartClass()
    {
      if (rc->DelRef() == 0) 
      {
        delete pData;
        delete rc;
      }
    }
    
    template <typename T>
    T& SmartClass<T>::operator*()
    {
      return *pdata;
    }
    
    template<typename T>
    T* SmartClass<T>::operator->()
    {
      return pData;
    }
    
    template <typename T>
    SmartClass<T>& SmartClass<T>::operator=(const SmartClass<T>& sp)
    {
      if (this != &sp)
      {
         if (rc->DelRef() == 0)
         {
            delete pData;
            delete rc;
         }
    
         pData = sp.pData;
         rc = sp.rc;
        rc->AddRef();
     }
        return *this;
    }
    

    主要的cpp

    #include "Person.h"
    #include "SmartClass.h"
    
    int main()
    {
        SmartClass<Person> p(new Person("Scott", 25));
        return 0;
    }
    

    在使用Visual Studio 2017构建程序时,我遇到了以下链接器错误。

    LNK2019未解析的外部符号“public:u thiscall SmartClass::SmartClass(class Person*)”(??0$SmartClass@VPerson@@@@QAE@PAVPerson@@@Z) 在函数_main中引用

    LNK2019未解析的外部符号“public:u thiscall SmartClass::~SmartClass(void)”(??1$SmartClass@VPerson@@@@QAE@XZ)在函数_main中引用

    我在这段代码中做错了什么?你能帮我纠正一下吗?

    非常感谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   罗成伟    8 年前

    有两个构造函数,一个没有参数,另一个有两个参数。如果要调用第二个构造函数,必须给出两个参数“Person*pt=new Person”(“Scott”,25)”。