Я настроил здесь класс шаблона и хотел поместить определение и реализацию метода в разные файлы. Я последовал предыдущему моделированию и записал его. Почему эта ошибка продолжала сообщать об отсутствии экземпляров? Я проверил и написал следующую симуляцию, которая должна работать нормально, но она продолжала сообщать об ошибках. Пожалуйста, попросите влиятельных лиц помочь выяснить, в чем проблема.
import mytestarray; // module name
#include <iostream>;
using namespace std;
int main()
{
MyArray<int> my;
system("pause");
}
export module mytestarray;
export import :defv;
export import :impv;
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 };
};
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
«хотел поместить определение и реализацию метода в разные файлы...» Самый простой и понятный способ — просто поместить/определить шаблоны в заголовок.
Может быть Почему шаблоны можно реализовать только в заголовочном файле?
я пытаюсь поместить/определить шаблоны в заголовок, это работает, но я хочу попробовать другой способ заставить его работать
Есть ли обновление? Вы пробовали компилятор GCC/G++?
нет, я не знаю, как попробовать GCC/G++, GCC или G++ поддерживает C++20? я новичок в C++
По предоставленной вами ссылке GitHub Предварительные требования и зависимости: gcc/g++ >= 5.4. Windows: рекомендуется использовать MinGW. G++ поддерживает C++ 20.
Сообщество разработчиков подает заявку Чармиан Ченг (BEYONDSOFT CONSULTING INC) [MSFT] На рассмотрении Спасибо, что нашли время сообщить нам об этой проблеме. У нас есть ошибка по этой проблеме. Статус этого элемента сообщества разработчиков будет обновляться по мере рассмотрения этой ошибки. Еще раз спасибо, что сообщили нам об этом.
В MSVC разделение конструктора и деструктора класса шаблона приведет к ошибке, указанной выше.
Временное решение: поместите определения обеих функций в один файл, где они объявлены (шаг 3: создайте файл MyArrayDefinition.cppm).
Сообщите об ошибке Сообществу разработчиков и разместите ссылку здесь, чтобы мы могли принять меры.
извините, я из Китая, я пытаюсь поместить определения обеих функций в один файл, это работает, но я хочу попробовать другой способ заставить его работать, как описано в книге «Профессиональный C++», глава 12.2.3. ошибка показывает китайский язык, но это то же самое, что и определения функций в другом файле
стоит ли мне опубликовать этот вопрос в сообществе разработчиков?
Это может быть проблема с компилятором. Да. Опубликуйте вопрос в сообществе разработчиков с минимальным кодом, который может воспроизвести проблему.
мы не можем прочитать эти ошибки в кандзи. Фактически вы можете переключить MSBuild для печати на английском языке, установив языковой пакет для Visual Studio или, в качестве запасного варианта, установив переменную среды VSLANG=1033.