Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 推导泛型类型的类枚举_C++_Templates - Fatal编程技术网

C++ 推导泛型类型的类枚举

C++ 推导泛型类型的类枚举,c++,templates,C++,Templates,考虑这个简单但完整的示例: #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&g

考虑这个简单但完整的示例:

#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;
}
但是编译器(g++7.3.0)给了我以下错误:

错误:“T”不是模板 constexpr-Foo推导_-Foo(X&&arg)


我做错了什么?

您需要声明T是一个模板,请尝试:

template <Foo F, template<Foo> class T>
constexpr Foo deduce_foo(T<F>&& arg)
{
    return F;
}
模板
constexpr-Foo推导_-Foo(T&&arg)
{
返回F;
}

您的
typename T
实际上不是一个“typename”。这是一个模板,而不是特定类型的名称。可能重复:它应该是
template constepr Foo演绎_Foo(C&&arg){…}
@Jarod42谢谢,工作正常
template <Foo F, template<Foo> class T>
constexpr Foo deduce_foo(T<F>&& arg)
{
    return F;
}