Wie passend leere Argumente pack in variadic template

Habe ich code:

template<typename T>
void loadBrush_sub_impl()
{
    //do some work here
}

template<typename T, typename... Targs>
void loadBrush_sub()
{
    loadBrush_sub_impl<T>();
    loadBrush_sub<Targs...>();
}

template<>
void loadBrush_sub<void>()
{
}

//BasicBrush, BinaryBrush, SketchBrush, BasicEraser and MaskBased are class
loadBrush_sub<BasicBrush, BinaryBrush, SketchBrush, BasicEraser, MaskBased, void>();

Dies ist korrekt, wenn es kompilieren. Allerdings habe ich wirklich wollen, um die drop void im Aufruf loadBrush_sub<BasicBrush, BinaryBrush, SketchBrush, BasicEraser, MaskBased, void>();.

Führt dies jedoch zu:

..\CanvasEngine\canvasengine.cpp: In instantiation of 'void loadBrush_sub() [with T = MaskBased; Targs = {}]':
..\CanvasEngine\canvasengine.cpp:36:5:   recursively required from 'void loadBrush_sub() [with T = BinaryBrush; Targs = {SketchBrush, BasicEraser, MaskBased}]'
..\CanvasEngine\canvasengine.cpp:36:5:   required from 'void loadBrush_sub() [with T = BasicBrush; Targs = {BinaryBrush, SketchBrush, BasicEraser, MaskBased}]'
..\CanvasEngine\canvasengine.cpp:114:81:   required from here
..\CanvasEngine\canvasengine.cpp:36:5: error: no matching function for call to 'loadBrush_sub()'
..\CanvasEngine\canvasengine.cpp:36:5: note: candidate is:
..\CanvasEngine\canvasengine.cpp:33:6: note: template<class T, class ... Targs> void loadBrush_sub()
..\CanvasEngine\canvasengine.cpp:33:6: note:   template argument deduction/substitution failed:
..\CanvasEngine\canvasengine.cpp:36:5: note:   couldn't deduce template parameter 'T'
mingw32-make[1]: *** [release/canvasengine.o] Error 1

Ich habe einige Experimente mit enable_if an, bekam aber keine glücklichen.
Gibt es irgendeine Lösung, um die drop void und machen den compiler glücklich?

  • Warum nicht zu entfernen template<> void loadBrush_sub<void>() Spezialisierung?
  • Ich denke nicht, dass es eh egal. Der compiler kann nicht folgern, das leere pack, mit oder ohne Spezialisierung.
  • Versuchen Sie, entfernen Sie es und betrachten Sie das Ergebnis.
  • Gleichen Ergebnis. Ich schrieb die Spezialisierung und die void hinter diesen Klassen, da hatte es den Fehler zu finden. Entfernen Sie es einfach bekommt mich zurück zu der ursprünglichen situation.
Schreibe einen Kommentar