<Профессиональный C++> 5-й, на основе главы 12-2-3, я пишу массив главы 15-2, но сообщаю об ошибке LNK2019

Я настроил здесь класс шаблона и хотел поместить определение и реализацию метода в разные файлы. Я последовал предыдущему моделированию и записал его. Почему эта ошибка продолжала сообщать об отсутствии экземпляров? Я проверил и написал следующую симуляцию, которая должна работать нормально, но она продолжала сообщать об ошибках. Пожалуйста, попросите влиятельных лиц помочь выяснить, в чем проблема.

  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

мы не можем прочитать эти ошибки в кандзи. Фактически вы можете переключить MSBuild для печати на английском языке, установив языковой пакет для Visual Studio или, в качестве запасного варианта, установив переменную среды VSLANG=1033.

Swift - Friday Pie 18.04.2024 22:16

«хотел поместить определение и реализацию метода в разные файлы...» Самый простой и понятный способ — просто поместить/определить шаблоны в заголовок.

user12002570 19.04.2024 11:10

я пытаюсь поместить/определить шаблоны в заголовок, это работает, но я хочу попробовать другой способ заставить его работать

NextOne 19.04.2024 16:35

Есть ли обновление? Вы пробовали компилятор GCC/G++?

Minxin Yu - MSFT 23.04.2024 10:49

нет, я не знаю, как попробовать GCC/G++, GCC или G++ поддерживает C++20? я новичок в C++

NextOne 24.04.2024 17:29

По предоставленной вами ссылке GitHub Предварительные требования и зависимости: gcc/g++ >= 5.4. Windows: рекомендуется использовать MinGW. G++ поддерживает C++ 20.

Minxin Yu - MSFT 25.04.2024 07:58

Сообщество разработчиков подает заявку Чармиан Ченг (BEYONDSOFT CONSULTING INC) [MSFT] На рассмотрении Спасибо, что нашли время сообщить нам об этой проблеме. У нас есть ошибка по этой проблеме. Статус этого элемента сообщества разработчиков будет обновляться по мере рассмотрения этой ошибки. Еще раз спасибо, что сообщили нам об этом.

NextOne 07.05.2024 17:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В MSVC разделение конструктора и деструктора класса шаблона приведет к ошибке, указанной выше.

Временное решение: поместите определения обеих функций в один файл, где они объявлены (шаг 3: создайте файл MyArrayDefinition.cppm).

Сообщите об ошибке Сообществу разработчиков и разместите ссылку здесь, чтобы мы могли принять меры.

извините, я из Китая, я пытаюсь поместить определения обеих функций в один файл, это работает, но я хочу попробовать другой способ заставить его работать, как описано в книге «Профессиональный C++», глава 12.2.3. ошибка показывает китайский язык, но это то же самое, что и определения функций в другом файле

NextOne 19.04.2024 16:39

стоит ли мне опубликовать этот вопрос в сообществе разработчиков?

NextOne 19.04.2024 16:40

Это может быть проблема с компилятором. Да. Опубликуйте вопрос в сообществе разработчиков с минимальным кодом, который может воспроизвести проблему.

Minxin Yu - MSFT 19.04.2024 17:25

Другие вопросы по теме