【发布时间】:2014-05-03 10:57:20
【问题描述】:
我有代码:
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>();
编译时这是正确的。但是,我真的很想在电话loadBrush_sub<BasicBrush, BinaryBrush, SketchBrush, BasicEraser, MaskBased, void>(); 中删除void。
但是,这会导致:
..\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
我用enable_if 进行了一些实验,但没有运气。
是否有任何解决方案可以删除 void 并使编译器满意?
【问题讨论】:
-
为什么不删除
template<> void loadBrush_sub<void>()专业化? -
@Constructor 我认为这并不重要。编译器无法推断出空包,无论有没有这种特化。
-
试试去掉看看效果。
-
@Constructor 结果相同。我在这些类后面写了专业化和
void,因为它有那个错误。删除它只会让我回到原来的状态。
标签: c++ templates variadic-templates variadic-functions