Le même problème se produit également avec moi: error: Couldn't lookup symbols:
Ma solution est d'utiliser explicitement remis en question la fonction quelque part dans un code source.
#include <vector>
template<typename T>
struct Vector : std::vector<T>
{
Vector(size_t n)
: std::vector<T>{n}
{}
T& operator[](size_t n)
{ return std::vector<T>::operator[](n); }
};
struct XXX
{
int x;
};
void func()
{
std::vector<XXX> a{10};
Vector<XXX> b{10};
auto x = b[0]; // gcc will produce an assembler code of operator[] for debug purpose
1; // as a break point
}
Définissez un point d'arrêt sur la ligne de 1; et de l'exécuter.
(lldb) p a[0]
error: Couldn't lookup symbols:
__ZNSt3__16vectorI3XXXNS_9allocatorIS1_EEEixEm
(lldb) p b[0]
(XXX) $0 = (x = 0)
Bingo!! La fonction existe dans un bloc de TEXTE?
(lldb) image lookup -r -n 'XXX.*operator'
1 match found in /Users/xxx/Library/Developer/Xcode/DerivedData/xxx:
Address: sandbox[0x00000001000011f0] (sandbox.__TEXT.__text + 256)
Summary: sandbox`Vector<XXX>::operator[](unsigned long) at main.cpp:19
Je ne suis pas sûr, mais j'avais appris cela avant. Un débogage stade, au lieu de l'étape de la production. Si nous avons mis un point d'arrêt sur une ligne en fonction d'un modèle, ce serait un débogueur à faire? Définition de points d'arrêt, effectivement remplacer certains de code assembleur avec siphon ou de sauter, ici et là, partout, le modèle est appliqué? Ou tout simplement mettre un point d'arrêt dans une fonction? Il est écrit comme un modèle. Donc, il devrait être incorporé dans une étape de production. Un débogage stade, cependant, la fonction n'est pas incorporé et écrit comme une fonction normale. S'il vous plaît ne pas simplement croire ce que je dis ici. Merci de confirmer par vous-même. Consulter la documentation de l' gcc,
clang,
et lldb.
#include <vector>
de MacOS 10.13.6, Xcode Version 9.4.1 a une macro _LIBCPP_INLINE_VISIBILITY
:
template <class _Tp, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
typename vector<_Tp, _Allocator>::reference
vector<_Tp, _Allocator>::operator[](size_type __n)
{
_LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
return this->__begin_[__n];
}
L' _LIBCPP_INLINE_VISIBILITY
est définie en #include <__config>
comme:
#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__))
Ces mots-clés hidden
et __always_inline__
semblent contrôler son comportement.
Quand j'ai ajouté inline _LIBCPP_INLINE_VISIBILITY
de la solution de l'échantillon de code ci-dessus:
inline _LIBCPP_INLINE_VISIBILITY
T& operator[](size_t n)
{ return std::vector<T>::operator[](n); }
traduite par:
(lldb) p b[0]
error: Couldn't lookup symbols:
__ZN6VectorI3XXXEixEm
J'espère que l'aide et quelqu'un look beaucoup plus profondément.