<Professional C++> 第五,基于chapter12-2-3,我写了chapter 15-2数组,但是报错LNK2019

问题描述 投票:0回答:1

我这里自定义了一个模板类,想把方法定义和实现放在不同的文件中。我按照之前的模拟,写下来了。为什么这个错误一直报告没有实例?我检查并写了下面的模拟,应该没问题,但是一直报错。请各位大佬帮忙看看是什么问题

  1. 创建day15.cpp
import mytestarray; // module name

#include <iostream>;
using namespace std;

int main()
{
    MyArray<int> my;
    system("pause");
}
  1. 创建模块文件,MyArrayTest.cppm
export module mytestarray;

export import :defv;
export import :impv;
  1. 创建 MyArrayDefinition.cppm 文件
module;
#include<cstddef>

export module mytestarray:defv;
import <utility>;
import <memory>;
import <stdexcept>;
import <iostream>;
import <format>;
export template<typename T>
class MyArray
{
public:
    MyArray();
    virtual ~MyArray();

    MyArray& operator=(const MyArray& myarray) = delete;
    MyArray(const MyArray& myarray) = delete;

    MyArray(MyArray&& src) noexcept;
    MyArray& operator=(MyArray&& rhs) noexcept;

    T& operator[](size_t x);
    const T& operator[](size_t x) const;

    const T& getElementAt(size_t x) const;

    void setElementAt(size_t x, const T& value);

    size_t getSize() const noexcept;
private:
    static const size_t AllocSize{ 4 };
    void resize(size_t newSize);
    T* m_elements{ nullptr };
    size_t m_size{ 0 };
};
  1. 创建 MyArrayDefinition.cppm 文件
module;
#include <cstddef>
export module mytestarray:impv;

import :defv;
export template<typename T>
MyArray<T>::MyArray()
{
    m_size = AllocSize;
    m_elements = new T[m_size]{};
}

export template<typename T>
MyArray<T>::~MyArray()
{
    delete[] m_elements;
    m_elements = nullptr;
}

export template<typename T>
MyArray<T>::MyArray(MyArray&& src) noexcept
    : m_elements {std::exchange(src.m_elements, nullptr)}
    , m_size {std::exchange(src.m_size, 0)} {}

export template<typename T>
MyArray<T>& MyArray<T>::operator=(MyArray&& rhs) noexcept
{
    if (this == &rhs)
    {
        return *this;
    }

    delete[] m_elements;
    m_elements = std::exchange(rhs.m_elements, nullptr);
    m_size = std::exchange(rhs.m_size, 0);
    return *this;
}

export template<typename T>
void MyArray<T>::resize(size_t newSize)
{
    auto newArray{ std::make_unique<T[]>(newSize) };
    for (size_t i = 0; i < m_size; i++)
    {
        newArray[i] = m_elements[i];
    }

    delete[] m_elements;
    m_size = newSize;
    m_elements = newArray.release();
}


export template<typename T>
void MyArray<T>::setElementAt(size_t x, const T& val)
{
    if (x >= m_size)
    {
        resize(x + AllocSize);
    }

    m_elements[x] = val;
}


export template<typename T>
T& MyArray<T>::operator[](size_t x)
{
    // TODO: 在此处插入 return 语句
    //std::cout << std::format("call no-const function") << std::endl;
    if (x >= m_size)
    {
        resize(x + AllocSize);
    }
    return m_elements[x];
}

export template<typename T>
const T& MyArray<T>::operator[](size_t x) const
{
    // TODO: 在此处插入 return 语句
//  std::cout << std::format("call const function") << std::endl;
    if (x >= m_size)
    {
        throw std::out_of_range{ "" };
    }
    return m_elements[x];
}

//export template<typename T>
//const T& MyArray<T>::operator[](size_t) const
//{
//  // TODO: 在此处插入 return 语句
//  std::cout << format("call const function") << std::endl;
//  if (x >= m_size)
//  {
//      static T nullValue{ T() };
//      return nullValue;
//  }
//  return m_elements[x];
//}


export template<typename T>
const T& MyArray<T>::getElementAt(size_t x) const
{
    if (x >= m_size)
    {
        throw std::out_of_range{ "" };
    }
    return m_elements[x];
}

export template<typename T>
size_t MyArray<T>::getSize() const noexcept
{
    return m_size;
}

运行时报告以下错误

1>day15.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall MyArray<int>::MyArray<int>(void)" (??0?$MyArray@H@@QAE@XZ::<!mytestarray>),
1>day15.obj : error LNK2019:  "public: virtual __thiscall MyArray<int>::~MyArray<int>(void)" (??1?$MyArray@H@@UAE@XZ::<!mytestarray>),函数 _main 中引用了该符号
1>D:\Project\CPlus\two\thir\CPlus\learnCPlus20\Debug\learnCPlus20.exe : fatal error LNK1120:

问题是什么,我参考了以下 https://github.com/carlesmartin85/procpp5e/blob/65aedda6a92745beca48a5041411465a33cdf4cd/code/c12_code/02_Grid/02_MethodsInInterfacePartition/GridDefinition.cppm

c++ visual-studio templates c++20
1个回答
0
投票

在MSVC中,将模板类构造函数和析构函数分开会产生上述错误。

临时解决方案:将两个函数的定义放在声明它们的同一文件中(第 3 步创建 MyArrayDefinition.cppm 文件)。

请将此错误报告给开发者社区并在此发布链接,以便我们跟进。

© www.soinside.com 2019 - 2024. All rights reserved.