tl; dr: Utilisez nullptr
, ou définir votre propre équivalent.
Le problème est que NULL
est quelque macro qui se dilate à une expression constante intégrale avec la valeur zéro. Pour appeler la fonction, std::find
doit déduire le type et utiliser la valeur (0
). Vous ne pouvez pas comparer int*
avec int
, d'où l'erreur. En ce qui concerne la fonction, vous venez de lui passer un certain int
ancien qui se trouve être zéro, et ceux-ci ne peuvent pas être convertis en null pointeurs; ils doivent être des expressions constantes intégrales.
Normalement NULL
« fonctionne » car il est utilisé dans des contextes où il est pas considéré comme sa forme entière, par exemple:
if (ptr == NULL)
Parce qu'ici il conserve son statut « d'expression constante intégrale », donc convertit un pointeur null du type compare-to.
Vous devez utiliser nullptr
si vous êtes en C++ 11 ou au-delà, car il s'agit en fait d'un pointeur nul, pas d'un entier qui le convertit. Ce que vous avez décrit est en fait l'un des facteurs de motivation pour introduire nullptr
.
Il existe plusieurs C++ 03 implémentations de nullptr
si vous en avez besoin. J'ai joint l'implémentation classique au bas de cette réponse.
En outre, vous devriez préférer std::array
si possible (Boost a un si vous en avez besoin), ou à tout le moins utiliser std::begin
et std::end
pour obtenir le tableau commence et les pointeurs de fin (et encore, il y a des mises en œuvre de ce flottant autour):
#include <algorithm>
#include <array>
int main() {
std::array<int*, 8> foo = {};
std::find(foo.begin(), foo.end(), nullptr);
}
Tous ont dit, dans une coulée de pincement au pointeur nULL de votre type est une solution valable. nullptr
est vraiment juste un raccourci pour "une chose qui convertit au pointeur nul du type nécessaire".
Voici une implémentation nullptr
, initialement créé par Scott Meyers:
const
struct nullptr_t {
template <typename T>
operator T*() const {
return 0;
}
template <typename C, typename T>
operator T C::*() const {
return 0;
}
private:
void operator&() const;
} nullptr = {};
La syntaxe ressemble un peu drôle parce que nous ne définissons pas généralement une classe et une variable en même temps. Évidemment, si vous voulez rester compatible C++ 11, nullptr
n'est pas un identifiant utilisable. null_ptr
ou nullpointer
sont de bonnes alternatives.
Pouvez-vous poster un [MCVE] comme d'habitude s'il vous plaît. –
@ Jarod42 'nullptr' édité car il n'a rien à voir avec la question. –
'NULL' est' 0', et n'a pas de type pointeur et est déduit comme type entier, donc l'erreur. – Jarod42