| Autor |
Nachricht |
C++11er
Unregistrierter
|
C++11er Unregistrierter
19:59:08 02.06.2012 Titel: |
Variadic int Template |
Zitieren |
Kann man die variadic Templates nicht auch für ints verwenden? Z.B. so
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <iostream>
template<int head, int ... tail>
struct Accumulator {
static const int result = head + Accumulator<tail...>::result;
};
template<int head>
struct Accumulator<head> {
static const int result = head;
};
int
main()
{
std::cout << Accumulator<1,2,3,4,5>::result << std::endl;
} | | |
|
|
|
 |
C++11er
Unregistrierter
|
C++11er Unregistrierter
20:00:27 02.06.2012 Titel: |
|
Zitieren |
Also bei obigem Code heult G++ bei mir herum und spuckt folgende Meldung aus:
| Code: | | test.cpp:5:57: sorry, unimplemented: cannot expand ‘tail ...’ into a fixed-length argument list | | |
|
|
|
 |
firefly
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.04.2002
Beiträge: 424
|
firefly Mitglied
20:17:58 02.06.2012 Titel: |
|
Zitieren |
welche gcc version verwendest du und hast du überhaupt den c++0x (bzw c++11) modus aktiviert? |
_________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
|
|
 |
C++11er
Unregistrierter
|
C++11er Unregistrierter
20:21:31 02.06.2012 Titel: |
|
Zitieren |
4.6.3 und ich übersetze mit
| Code: | | g++ -pedantic -std=c++0x -W -Wall -o test test.cpp | | |
|
|
|
 |
GorbGorb
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.06.2011
Beiträge: 179
|
GorbGorb Mitglied
20:22:55 02.06.2012 Titel: |
|
Zitieren |
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream>
template< int... >
struct Accumulator;
template<int head, int ... tail>
struct Accumulator< head , tail... > {
static const int result = head + Accumulator<tail...>::result;
};
template<int head>
struct Accumulator<head> {
static const int result = head;
};
int
main()
{
std::cout << Accumulator<1,2,3,4,5>::result << std::endl;
} | |
funktioniert bei mir.
Das Problem ist, denke ich, dass dein template nicht mit einem parameter pack anfängt, da es als
| C++: | template<int head, int ... tail>
struct Accumulator; | |
deklariert wurde. Das parameter pack kann der gcc offensichtlich nicht in ein einzelnes Argument packen (wenn das template so deklariert wurde, bei Spezialisierung funktioniert es offensichtlich). Arbeite einfach mit dem workaround den ich gepostet habe. |
|
|
|
 |
C++11er
Unregistrierter
|
C++11er Unregistrierter
20:26:46 02.06.2012 Titel: |
|
Zitieren |
Danke, damit klappt es!
Was ist ein parameter pack bzw. ein einziges? Sprich, mir ist das Problem nicht ganz klar, das du mit dem Workaround löst. |
|
|
|
 |
GorbGorb
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.06.2011
Beiträge: 179
|
GorbGorb Mitglied
20:35:55 02.06.2012 Titel: |
|
Zitieren |
| C++: | | template< int... parameter_pack > | |
Das ist ein parameter pack. Und beim gcc ist das nicht möglich:
| C++: | template< int no_parameter_pack , int... >
struct XY;
XY< parameter_pack... > x; | |
XY hat als erstes Argument kein parameter pack, man übergibt XY aber ein parameter pack. Eigentlich wäre das so möglich, indem das parameter pack aufgesplittet wird (vermutlich, wenn sich der gcc dafür entschuldigt), aber beim gcc wohl noch nicht. Das Problem scheint nur aufzutreten, wenn das template so deklariert wurde, d.h. parameter packs werden bei Spezialisierungen richtig aufgeteilt. |
|
|
|
 |
firefly
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.04.2002
Beiträge: 424
|
firefly Mitglied
20:36:41 02.06.2012 Titel: |
|
Zitieren |
ok anscheinend ist diese syntax variante des variadic template im gcc 4.6 noch nicht implementiert. Ich kann deinen beispielcode mit clang version 3.2 (svn build) bauen.
Edit: mit gcc 4.7.0 funktioniert es auch. |
_________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
Zuletzt bearbeitet von firefly am 22:14:12 02.06.2012, insgesamt 1-mal bearbeitet |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|