Пишу код в Qtcreator на Linux подключены библиотеки "safelib С" для работы bounds-checking при компиляции пишет ошибку
**ошибка: invalid conversion from ‘const char*’ to ‘rsize_t {aka long unsigned int}’ [-fpermissive] strcpy_s(m_Model, Model); ^
И ошибка
ошибка: too few arguments to function ‘errno_t strcpy_s(char*, rsize_t, const char*)’
#include "Header.h"
#include <iostream>
#include <cstring>
#include <safe_lib.h>
#include <safe_lib_errno.h>
#include <safe_mem_lib.h>
#include <safe_types.h>
#include <safe_str_lib.h>
using namespace std;
Weapon::Weapon() :
m_pName(new char[1]),
m_Power(0),
m_Calibre(0)
{
*m_pName = '\0'; m_Model[0] = '\0';
}
Weapon::Weapon(const char* Name, int Power, const char* Model, int Calibre) :
m_pName(new char[strlen(Name) + 1]),
m_Power(Power),
m_Calibre(Calibre)
{
strcpy_s(m_pName, strlen(Name) + 1, Name);
strcpy_s(m_Model, Model); ------- тут ошибка
}
Weapon :: Weapon (const Weapon& Wep) :
m_pName (new char [strlen (Wep.m_pName) + 1]),
m_Power (Wep.m_Power),
m_Calibre (Wep.m_Calibre) {
strcpy_s (m_pName, strlen (Wep.m_pName) + 1, Wep.m_pName);
strcpy_s (m_Model, Wep.m_Model, ) ;
}
Weapon:: ~Weapon()
{
delete m_pName;
}
void Weapon :: setName (const char* pName) {
delete [ ] m_pName ;
m_pName = new char [strlen (pName) + 1] ;
strcpy_s (m_pName, strlen (pName) + 1, pName) ;}
void Weapon::setModel(const char* Model)
{
strcpy_s(m_Model, Model, );
}
void Weapon::setPower(int Power)
{
m_Power = Power;
}
void Weapon::setCalibre(int Calibre)
{
m_Calibre = Calibre;
}
char* Weapon :: getName ( ) const {
return m_pName;}
char* Weapon :: getModel ( ) const
{
return const_cast <char*> (m_Model) ;
}
int Weapon::getPower() const
{
return m_Power;
}
int Weapon::getCalibre() const
{
return m_Calibre;
}
bool Weapon :: checkName (const char* p) const
{
return ! strcmp (m_pName, p) ;
}
В ошибке прямым текстом написано, что strcpy_s принимает 3 аргумента, а не 2. https://msdn.microsoft.com/ru-ru/library/td1esda9.aspx
errno_t strcpy_s(
char *strDestination, // <- Куда копировать
size_t numberOfElements, // <- Размер строкового буфера назначения в единицах char для узкой и многобайтовых функций и в единицах wchar_t для расширенных функций (https://msdn.microsoft.com/ru-ru/library/td1esda9.aspx)
const char *strSource // <- откуда
);
Далее перегруженная шаблонная функция с двумя параметрами. Работает аналагично, если я правильно понял, но только там, где поддерживается c++. И второй параметр уходит в шаблон - это максимальный размер строкового буффера, использующийся при копировании.
template <size_t size>
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
); // C++ only
Итого, если у вас поддерживается C++ (Что вероятно) надо делать так:
size_t len = strlen (Model)
strcpy_s<len>(m_Model, Model);
Или так, что одно и тоже.
size_t len = strlen (Model)
strcpy_s(m_Model, len, Model);
Приблизительно так.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники