【发布时间】:2016-11-08 20:59:57
【问题描述】:
从这个问题Why should I avoid std::enable_if in function signatures看来我应该可以写
#include <type_traits>
#include <iostream>
enum Class {
Primary,
Secondary
};
template<Class C>
class Entity {
public:
template<typename Cls = C, typename Sec = Secondary, std::enable_if<std::is_same<Cls, Sec>::value>::type = 0>
void onlyLegalForSecondaryEntities() {
std::cout << "Works" << std::endl;
}
};
int main() {
Entity<Secondary> e;
e.onlyLegalForSecondaryEntities();
return 0;
}
但是编译失败并出现错误prog.cpp:13:7: note: template argument deduction/substitution failed
如何编译这段代码?
【问题讨论】:
-
Secondary不是类型 -
如何将
Entity的模板参数限制为具有类型的主要或次要类型? -
@shane,您似乎对基本的 C++ 概念有很大的误解。我建议你choose a book,学习它,一旦你掌握了基础知识再回来。
-
@StoryTeller 没有帮助。如果您可以在枚举上进行模板化,那么当
std::is_same用作模板参数时不会评估枚举和类型之间的相同性,这是一个完全合理的误解。 -
@shane,将类型与值进行比较是合理的!?我支持我所说的。回归基础。
标签: c++ c++11 templates sfinae typetraits