我想专门研究templated
方法。它使用std::enable_if
来检查给定类型的静态属性:
template <class T, bool fancy= T::IsFancy()>
typename std::enable_if<fancy, void>::type
onlyForFancyGuys(T* component) {
/*stuff*/
onlyForFancyGuys(component->parent);
}
当我将它用于递归调用时,我需要一种方法来确定递归何时结束。也就是说,当使用类型Foo
时。所以我尝试了这个专业化。
template<>
typename void onlyForFancyGuys<Foo, true>(Foo* component);
和
template<>
void onlyForFancyGuys<Foo, true>(Foo* component);
但它一直告诉我,这个template-id
与任何模板声明都不匹配。我在这做错了什么?是否有enable_if
特定的内容?
重要事实:Foo
没有方法IsFancy
。
修改:我已将IsFancy
添加到Foo
,但它没有任何区别。
编辑:我正在使用MinGW进行编译。但我也计划使用MSVC。
修改:将IsFancy
添加到Foo
以及接受的答案就可以了。
答案 0 :(得分:2)
只需使用过载:
void onlyForFancyGuys(Foo* component) { /* ... */ }
template <class T, bool fancy = T::IsFancy()>
typename std::enable_if<fancy, void>::type
onlyForFancyGuys(T* component) {
/*stuff*/
onlyForFancyGuys(component->parent);
}
感谢SFINAE(template
), T::IsFancy()
将被排除在外
答案 1 :(得分:1)
在:
template<>
typename void onlyForFancyGuys<Foo, true>(Foo* component);
Gid在void之前删除了tof typename。
答案 2 :(得分:0)
我认为在递归的某个时刻,你到达的地方没有模板可以实例化。 尝试在顶部声明一般模板,首先打破递归,然后完成剩下的工作。有一些奇怪的逻辑,我不太明白,但我会尝试至少编译。我认为在你的情况下,enable_if不在正确的位置。一般来说,它会解决一些设计问题。
template<typename T>
void onlyForFancyGuys(T* t) {
}
和
template<typename T, bool b>
void onlyForFancyGuys(T* t) {
}
并在专业化中删除void之前的typename,就像有人说的那样。