Frage

Ich habe den folgenden Code:

template <typename T> LuaCall& operator>>(T) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
template <> LuaCall& operator>><int&>(int& val) { mResults.push_back(std::make_pair(LUA_RESULT_INTEGER, (void *)&val)); return *this; }
template <> LuaCall& operator>><float&>(float& val) { mResults.push_back(std::make_pair(LUA_RESULT_FLOAT, (void *)&val)); return *this; }
template <> LuaCall& operator>><double&>(double& val) { mResults.push_back(std::make_pair(LUA_RESULT_DOUBLE, (void *)&val)); return *this; }
template <> LuaCall& operator>><bool&>(bool& val) { mResults.push_back(std::make_pair(LUA_RESULT_BOOLEAN, (void *)&val)); return *this; }
template <> LuaCall& operator>><std::string&>(std::string& val) { mResults.push_back(std::make_pair(LUA_RESULT_STRING, (void *)&val)); return *this; }
template <> LuaCall& operator>><LuaNilStruct>(LuaNilStruct) { mResults.push_back(std::make_pair(LUA_RESULT_NIL, (void *)NULL)); return *this; }

Und dann:

int abc;
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333 >> abc;

Ich will es irgendwie wie cin arbeiten >> tut, dh es abc der Rückgabewert der Funktion lua schreiben muss. Also muss ich seine Adresse .. aber es Standardwerte auf der Standardvorlage. Was mache ich falsch? Es ist sicherlich eine Möglichkeit, dies zu tun, da cin tut genau das.

Danke!


Hinweis wem auch immer veränderte das% 's auf >>: Ich habe es wieder geändert, da es so, wie es ist: D Der Code ruft den Lua Funktionstest ( ‚test‘, 5, nil, 2,333) und speichere den Rückgabewert zu abc. % 'S sind für die Parameter der Funktionen, >>' s sind für den Rückgabewert (e).

template <typename T>
LuaCall& operator%(T val) {
    mLua->Push(val);
    ++mArguments;
    return *this;
}
War es hilfreich?

Lösung

You'v geschrieben Operator >> als unärer Operator, aber es ist ein binärer Operator. LeftHandSide >> RightHandSide.

Das Formular std::cout <"Hello" << " world"; daher ist (operator<<(operator<<(std::cout, "Hello"), " world); -. Die erste << zurück std :: cout für die Verwendung als der linken Seite des zweiten <<

Das eigentliche Problem ist, dass in Ihrem Code Lookup geschieht wie folgt:

  1. candiate Funktionen bestimmt sind (nur ein Kandidat, der Vorlage)
  2. T abgeleitet wird.
  3. Bestimmen Sie
  4. die Spezialisierung (falls vorhanden) zu instanziiert.

In Schritt 2 T == int. In Schritt 3 gibt es keine Spezialisierungen für T==int so die Basisvorlage ausgewählt wird und instanziiert. Sie könnten eine Überlastung verwenden statt einer Spezialisierung wollen. Die Überlastung wäre eine bessere Übereinstimmung in Schritt 1, so dass Sie nicht einmal auf den Punkt der Vorlage Argument Abzug bekommen

Andere Tipps

Sie können keine konstanten Werte ("test" , 5 or 2.333) verwenden, bei denen Referenzen zu erwarten sind. Ändern Sie die Vorlage und Parametertyp Ihres operator>> bis (int, float etc.), wenn Sie dieses Verhalten möchten.

Zum einen ist operator>> ein binär Operator. Das heißt, es zwei Argumente zu übernehmen hat. Das erste Argument muss sein, was auch immer ist die Art von

LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333

Seit diesem Zurückgegeben LuaCall&, nehme ich an, dass das, was das Ergebnis dieses Aufruf (und damit linkes Argument) ist.

Von dieser mResult nehme ich an, dass Sie diesen Operator als Klassenmitglied zu tun versuchen. Aber ich glaube nicht, können Sie Mitglied Vorlagen spezialisieren.

Schließlich, ich glaube nicht, dass Sie für Referenztypen spezialisieren sollen. Diese

template <> LuaCall& operator>><int>(int val);

tun sollte,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top