【发布时间】:2019-07-19 03:17:02
【问题描述】:
我有这样的代码:
class Bar {
public:
void print() {
std::cout << "bar\n";
}
};
template<typename T>
class Foo {
public:
template <typename std::enable_if<std::is_base_of<T,Bar>::value,T>::type>
void print() {
t.print();
}
template <typename>
void print() {
std::cout << t << std::endl;
}
private:
T t;
};
int main() {
// Foo<int> foo1;
Foo<Bar> foo2;
foo2.print();
}
这段代码的目的是:如果T t是Bar或者Bar的子类,那么foo.print()推导为void print() {t.print();},否则推导为void print() {std::cout << t << std::endl;},但事情并没有不像我预期的那样工作。编译器错误:
"一个非类型模板参数不能有类型'typename std::enable_if::value, Bar>::type' (又名 '酒吧')",
这段代码有什么问题?
【问题讨论】:
-
在
template <typename之后,需要一个标识符。与template <typename T>一样。您对print的定义不是有效的C++。 -
@IgorTandetnik,我将
...::type>更改为...::type* = nullprt>并且有效,但我不知道为什么要这样写。 -
如果没有 =,您无法为 typename 模板参数命名默认值。
标签: c++ c++11 compiler-errors sfinae template-specialization