考虑这个简单但完整的例子:
#include <iostream>
enum class Foo
{
A,
B
};
template <Foo F>
struct X{};
template <Foo F>
constexpr Foo deduce_foo(X<F>&& arg)
{
return F;
}
int main()
{
if ( deduce_foo(X<Foo::B>{}) == Foo::A )
std::cout << "A";
else
std::cout << "B";
std::cout << std::endl;
}
正确推导出enum class
(函数deduce_foo(...)
)。
现在,我想使它更通用,用模板T代替X,即:
template <Foo F, typename T>
constexpr Foo deduce_foo(T<F>&& arg) { ... }
但是编译器(g ++ 7.3.0)给了我这个错误:
错误:'T'不是模板 constexpr Foo deduce_foo(X&amp;&amp; arg)
我做错了什么?
答案 0 :(得分:3)
您需要声明T是模板,请尝试:
template <Foo F, template<Foo> class T>
constexpr Foo deduce_foo(T<F>&& arg)
{
return F;
}