Also ich bin gerade dabei, einen Speicher-Debugger zu schreiben, und dazu brauche ich STL-Container-Objekte, um einen untracked Zuordner zu verwenden.std :: string mit einem benutzerdefinierten Zuweiser
Ich habe std :: string in meiner ganzen Code-Basis gespickt, so dass ich typedef'd es mein untracked allocator zu verwenden:
typedef std::basic_string<char, std::char_traits<char>, UntrackedAllocator<char>> String;
Jetzt, wenn ich versuche, dies zu tun:
String str { "Some string" };
String copy = str;
ich bekomme diese Fehlermeldung:
/usr/local/include/c++/7.1.0/ext/alloc_traits.h:95:67: error: no matching function for call to 'UntrackedAllocator<char>::UntrackedAllocator(UntrackedAllocator<char>)' { return _Base_type::select_on_container_copy_construction(__a); }
Dies ist, was mein Untracked Allocator wie folgt aussieht:
#pragma once
#define NOMINMAX
#undef max
template <typename T>
class UntrackedAllocator {
public:
typedef T value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
public:
template<typename U>
struct rebind {
typedef UntrackedAllocator<U> other;
};
public:
inline explicit UntrackedAllocator() {}
inline ~UntrackedAllocator() {}
inline explicit UntrackedAllocator(UntrackedAllocator const&) {}
template<typename U>
inline explicit UntrackedAllocator(UntrackedAllocator<U> const&) {}
// address
inline pointer address(reference r) {
return &r;
}
inline const_pointer address(const_reference r) {
return &r;
}
// memory allocation
inline pointer allocate(size_type cnt,
typename std::allocator<void>::const_pointer = 0) {
T *ptr = (T*)malloc(cnt * sizeof(T));
return ptr;
}
inline void deallocate(pointer p, size_type cnt) {
free(p);
}
// size
inline size_type max_size() const {
return std::numeric_limits<size_type>::max()/sizeof(T);
}
// construction/destruction
inline void construct(pointer p, const T& t) {
new(p) T(t);
}
inline void destroy(pointer p) {
p->~T();
}
inline bool operator==(UntrackedAllocator const& a) { return this == &a; }
inline bool operator!=(UntrackedAllocator const& a) { return !operator==(a); }
};
Dies ist das erste Mal, dass ich mit benutzerdefinierten Zuordnern arbeite, also habe ich keine Ahnung, was damit passiert. Es ist unglaublich ärgerlich, dass ich str1 = str2 nicht tun kann, wenn einer von ihnen einen benutzerdefinierten Zuordner verwendet.
Ihre relationalen Operatoren sind falsch. Zuweiser sollten den gleichen Vergleich durchführen, wenn die Zuordnung des anderen aufgehoben werden kann. –
http://stackoverflow.com/help/mcve –
Die Fehlermeldung impliziert, dass Sie irgendwo einen Kopierkonstruktor verwenden. Der von Ihnen gepostete Code verwendet keine Kopie eines Konstruktors, es sei denn, Ihr Indexoperator gibt einen Wert zurück. Wie auch immer, das Kopieren des Konstruktors ist nur selten sinnvoll. Entfernen Sie das 'explizite' aus dem Kopierkonstruktor und die Dinge sollten in Ordnung sein. –