[英]error: strcpy was not declared in this scope
我在 Ubuntu g++ 版本 4.4.3 中編譯的 c++ 問題中遇到了這個問題。 我不知道要包含的標題來解決這個問題..謝謝
centro_medico.cpp: In constructor ‘Centro_medico::Centro_medico(char*, char*, int, int, float)’:
centro_medico.cpp:5: error: ‘strcpy’ was not declared in this scope
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘Centro_medico& Centro_medico::operator=(const Centro_medico&)’:
centro_medico.cpp:26: error: ‘strcpy’ was not declared in this scope
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘bool Centro_medico::quitar_medico(int)’:
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_especialidades(std::ostream&) const’:
centro_medico.cpp:123: error: ‘strcmpi’ was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_horarios_consulta(char*) const’:
centro_medico.cpp:162: error: ‘strcmpi’ was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::crea_medicos()’:
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’
medico.cpp
#include "medico.h"
#include <cstdlib>
#include <iostream>
#include <stdlib>
#include<cstring>
#include<string>
long Medico::total_consultas=0;
Medico::Medico(char *nom,char * espe,int colegiado,int trabajo)
{
int i;
strcpy(nombre,nom);
strcpy(especialidad,espe);
num_colegiado=colegiado;
num_horas_diarias=trabajo;
citas_medico= new Cita*[5]; // 5 Días de las semana, de Lunes a Viernes.
for (i=0;i<5;i++)
citas_medico[i]=new Cita[num_horas_diarias];
}
Medico::Medico(const Medico &m){
int i;
citas_medico=new Cita*[5];
for (i=0;i<5;i++)
citas_medico[i]=NULL;
(*this) = m;
}
Medico &Medico::operator=(const Medico &m){
int i,j;
if (this != &m) { // Para evitar la asignación de un objeto a sí mismo
strcpy(nombre,m.nombre);
strcpy(especialidad,m.especialidad);
num_colegiado=m.num_colegiado;
num_horas_diarias=m.num_horas_diarias;
for (i=0;i<5;i++){
delete citas_medico[i];
citas_medico[i]=new Cita[num_horas_diarias];
for(j=0;j<num_horas_diarias;j++){
citas_medico[i][j] = m.citas_medico[i][j] ;
}
}
}
return *this;
}
medico.h
#pragma once
#include <cstdlib>
#include <iostream>
using namespace std;
#include "cita.h"
class Medico
{
private:
char nombre[50];
char especialidad[50];
int num_colegiado;
int num_horas_diarias;
Cita **citas_medico;
static long total_consultas;
public:
void mostrar_calendario_citas(ostream &o=cout) const;
bool asignar_cita(int d, int hor,Paciente *p=NULL);
void anular_cita(int d, int hor);
bool consultar_cita(char dni[10], int modificar=0);
void modificar_cita(int d, int hor);
void vaciar_calendario_citas();
void borrar_calendario_citas();
char* get_especialidad(char espec[50]) const;
char* get_nombre(char n[50]) const;
int get_num_colegiado() const;
int get_num_horas() const;
void set_num_horas(int horas);
void mostrar_info(ostream &o=cout) const;
static long get_total_consultas();
Cita* operator[](int dia);
void eliminar_calendario_citas();
void crear_calendario_citas();
Medico(char *nom,char * espe,int colegiado,int trabajo);
Medico(const Medico &m);
Medico &operator=(const Medico &c);
void operator delete(void*);
~Medico();
};
ostream& operator<<(ostream &o, Medico &c);
ofstream& operator<<(ofstream &fichero, Medico &m);
ifstream& operator>>(ifstream &fichero, Medico &m);
觀察:
#include <cstring>
應該引入 std::strcpy()。using namespace std;
(如 medico.h 中所寫)將來自std::
任何標識符引入全局命名空間。 除了using namespace std;
一旦應用程序變大就會有點笨拙(因為它在全局命名空間中引入了一大堆標識符),並且你永遠不應該在頭文件中使用using
(見下文!), using namespace
不會影響之后引入的標識符該聲明。
( using namespace std
寫在頭文件中,該頭文件包含在 medico.cpp 中,但#include <cstring>
緊隨其后。)
我的建議:把using namespace std;
(如果你堅持使用它)進入 medico.cpp,在任何包含之后,並在 medico.h 中使用顯式std::
。
strcmpi()
根本不是標准函數; 在 Windows 上定義時,您必須在 Linux 上以不同的方式解決不區分大小寫的比較。
(一般來說,我想指出這個關於在 C 和 C++ 中考慮 Unicode 的“正確”字符串處理的答案,因為每個應用程序都應該考慮。總結:標准無法正確處理這些事情;請使用ICU 。 )
warning: deprecated conversion from string constant to ‘char*’
“字符串常量”是指您在代碼中編寫字符串文字(例如"Hello"
)。 它的類型是const char[]
,即常量字符數組(因為您不能更改字符)。 您可以將數組分配給指針,但分配給char *
,即刪除const
限定符,會生成您看到的警告。
OT澄清: using
頭文件改變標識符的可見性,任何人包括頭,這通常不是你的頭文件的用戶想要什么。 例如,我可以在我的代碼中完美地使用std::string
和自寫的::string
,除非我包含您的 medico.h ,否則這兩個類會發生沖突。
不要在頭文件中使用using
。
即使在實現文件中,它也會引入很多歧義。 在實現文件中也可以使用顯式命名空間。
當你說:
#include <cstring>
g++ 編譯器應該將它自己包含的<string.h>
聲明放入std::
和全局命名空間中。 它看起來出於某種原因,好像它沒有這樣做。 嘗試用std::strcpy
替換strcpy
一個實例,看看是否能解決問題。
在這樣的情況下有時會發生此錯誤:
#ifndef NAN
#include <stdlib.h>
#define NAN (strtod("NAN",NULL))
#endif
static void init_random(uint32_t initseed=0)
{
if (initseed==0)
{
struct timeval tv;
gettimeofday(&tv, NULL);
seed=(uint32_t) (4223517*getpid()*tv.tv_sec*tv.tv_usec);
}
else
seed=initseed;
#if !defined(CYGWIN) && !defined(__INTERIX)
//seed=42
//SG_SPRINT("initializing random number generator with %d (seed size %d)\n", seed, RNG_SEED_SIZE)
initstate(seed, CMath::rand_state, RNG_SEED_SIZE);
#endif
}
如果以下代碼行未在運行時運行:
#ifndef NAN
#include <stdlib.h>
#define NAN (strtod("NAN",NULL))
#endif
您將在代碼中遇到如下錯誤; 因為initstate被放置在stdlib.h文件中,它不包括在內:
In file included from ../../shogun/features/SubsetStack.h:14:0,
from ../../shogun/features/Features.h:21,
from ../../shogun/ui/SGInterface.h:7,
from MatlabInterface.h:15,
from matlabInterface.cpp:7:
../../shogun/mathematics/Math.h: In static member function 'static void shogun::CMath::init_random(uint32_t)':
../../shogun/mathematics/Math.h:459:52: error: 'initstate' was not declared in this scope
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.