El siguiente códigode búsqueda conversión implícita en la plantilla de falla para el amigo función definida fuera de la clase
#include <cassert>
#include <cstddef>
template <typename T>
struct foo {
foo(std::nullptr_t) { }
//friend bool operator ==(foo lhs, foo rhs) { return true; }
template <typename U>
friend bool operator ==(foo<U> lhs, foo<U> rhs);
};
template <typename T>
inline bool operator ==(foo<T> lhs, foo<T> rhs) { return true; }
int main() {
foo<int> p = nullptr;
assert(p == nullptr);
}
falla al compilar con el mensaje de error
foo.cpp:18:5: error: no match for '
operator==
' in 'p == nullptr
'
foo.cpp:18:5: note: candidate is:
foo.cpp:14:13: note:template<class T> bool operator==(foo<T>, foo<T>)
foo.cpp:14:13: note: template argument deduction/substitution failed:
foo.cpp:18:5: note: mismatched types 'foo<T>
' and 'std::nullptr_t
'
Sin embargo, si uso la definición dentro de la clase en cambio, el código funciona como se esperaba.
Permítanme decir que entiendo el mensaje de error: la plantilla argumento T
no se puede deducir el tipo de nullptr
(dicho sea de paso, decltype(*nullptr)
no compila). Además, esto puede arreglarse aquí simplemente definiendo la función dentro de la clase.
Sin embargo, por razones de uniformidad (hay otras funciones de amigo que I necesitan para definir afuera) Me gustaría definir esta función fuera de la clase.
¿Existe un "truco" para hacer que una definición fuera de clase funcione?
Creo que quieres decir "función miembro" y "función no miembro" en lugar de "en línea" y "no-inline". En su ejemplo, tiene una función en línea no miembro, y creo que está diciendo que funciona si la convierte en una función miembro. –
@VaughnCato ¿Los amigos cuentan como funciones miembro? No estoy seguro de eso. Ciertamente no están en el espacio de nombres de la clase. –
Las funciones de amigo serán funciones que no sean miembro, pero pueden o no estar en línea, y pueden definirse interna o externamente para la clase. En su caso, tiene una función en línea que se define externamente a la clase. –