Fehler beim Verwenden von decltype () in C ++ 11 (Erstellen einer undurchsichtigen Fehlermeldung in gcc 4.7.0)
mit folgendem Code (eine gekochte Version meines ursprünglichen Codes)
#include <iostream>
#include <cmath>
template <typename> class A; // edit 1 following Mark & Matthieu
template <typename X> class A {
X a;
template <typename> friend class A; // edit 1 following Mark & Matthieu
public:
A(X x) : a(x) {}
X get() const { return a; } // edit 2 to avoid using A<Y>::a
template <typename Y>
auto diff(A<Y> const& y) const
-> decltype(a - y.a) // original code causing error with gcc
-> typename std::common_type<X, Y>::type // alternative following Rook
-> decltype(this->get() - // edit 3 not using A<X>::a
y.get()) // edit 2 not using A<Y>::a
{ return a - y.get(); }
};
template <typename X, typename Y>
inline auto dist(A<X> const& x, A<Y> const& y) -> decltype(std::abs(x.diff(y)))
{ return std::abs(x.diff(y)); }
int main()
{
A<double> x(2.0), y(4.5);
std::cout << " dist(x,y)=" << dist(x,y) << '\n'; // <-- error here
}
Ich erhalte den folgenden Fehler mit gcc 4.7.0:
test.cc: In Funktiondecltype (std::abs(x.diff(y))) dist(const A<X>&, const A<Y>&)
[mitX = double; Y = double; decltype (std::abs(x.diff(y))) = double
] ’:
test.cc:5:5: Fehler:double A<double>::a
ist privat
hervorgehobene Zeile: Fehler: in diesem Kontext
Diese Fehlermeldung ist offensichtlich nicht sehr hilfreich. Befindet sich ein Fehler in meinem Code? Oder ist das ein Problem mit dem Compiler?
EDIT1: die Freundschaftserklärung hat nicht geholfen.
EDIT2: Vermeidung vonA<Y>::a
hat auch nicht geholfen.
EDIT3: zusammen mitEDIT2 endlichProblem behoben. Dasdecltype()
in der Definition vondist()
erfordert diedecltype()
zumA<X>::diff()
, die wiederum verwendetA<X>::a
, die im ersten Zusammenhang privat ist.
EDTI4: Rooks Vorschlag zur Verwendungtypename std::common_type<X,Y>::type
funktioniert auch!
EDIT5: aber siehe Jonathan Wakelys Antwort aufdiese Frage