'U' bezieht sich nicht auf einen Wert
Ich bin mit coliru.
Befehlszeile:
g++ -std=c++11 -O2 main.cpp && ./a.out
clang++ -std=c++11 -O2 main.cpp && ./a.out
Der folgende code kompiliert fein in g++ aber nicht in clang++.
template <typename T, typename... U>
A& operator ()(T a, U... b)
{
struct Inner {
operator decltype(T(U...)) const {
return a(b...);
}
} inner;
return *this;
}
main.cpp:17:37: Fehler: "U" bezieht sich nicht auf einen Wert
operator decltype(T(U...)) const { ^
main.cpp:13:43: Anmerkung: erklärt hier
template <typename T, typename... U> ^
1 Fehler generiert.
Den Fehler bekomme ich jetzt:
main.cpp:18:41: error: reference to local variable 'a' declared in enclosing function 'operator()'
Meine Klasse sieht wie folgt aus:
template <typename R>
class A {
R value = R();
public:
A() { }
~A() { }
template <typename T, typename... U>
A& operator ()(T a, U... b)
{
struct Inner {
operator decltype(std::declval<T>()(std::declval<U>()...))() const {
//some code here to return a(b...)
}
} inner;
value += inner;
return *this;
}
R val() {
return value;
}
};
- Sie sollten nicht einfach komplett ändern Sie Ihre Frage - das macht es fast nutzlos für Menschen, die mit dem ursprünglichen problem. Wenn Sie zwei Fragen haben, bitten Sie Sie als solche.
- Sorry, ich war nicht sicher, wie das problem zu beschreiben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist der compiler Recht, es bezieht sich auf Arten, nicht um Werte. Sie müssen schreiben:
(die letzten
()
sind, benötigt es eine gültige Konvertierung operator der formoperator T() const
)Sagte, dass Sie nicht verwenden können
a
undb...
innerhalb vonInner
, also das ganze Beispiel macht keinen Sinn. Was auch immer Ihr Anwendungsfall ist, die oben nicht wirklich funktioniert, kann ich Ihnen zeigen, wie fix die Signatur so, dass das Geräusch akzeptiert den code, aber Sie werden noch nicht in der Lage, es zu benutzen.Und nach dem update, es ist eine ganz andere Frage jetzt. Vielleicht ist dies für Sie arbeitet:
Unter Bezugnahme auf Walter ' s Kommentar: Man könnte, jetzt, dass Sie die übergabe der Parameter, auch trailing-return-Typen:
oder mit C++14, die Sie nutzen könnten
decltype(a(b...))
(siehe meine Antwort)?a
undb...
innerhalbInner
ohne Parameter, um die Betreiber.