Deduce类的模板参数

时间:2017-10-04 12:58:44

标签: c++ templates c++14 type-deduction template-templates

有人可以帮我理解为什么以下代码无法编译:

#include <type_traits>

template< typename T >
class A
{};

template< typename T >
class B
{};

template< template <typename T> class GENERAL_t,  // Note: GENERAL_t is either A<T> or B<T>
          typename = std::enable_if_t< std::is_same<T,int>::value >
        >
void foo( GENERAL_t a )
{}

错误消息:

t.cpp:67:57: error: use of undeclared identifier 'T'
              typename = std::enable_if_t< std::is_same<T,int>::value >
                                                        ^
t.cpp:67:65: error: no type named 'value' in the global namespace
              typename = std::enable_if_t< std::is_same<T,int>::value >
                                                              ~~^
t.cpp:69:15: error: use of class template 'GENERAL_t' requires template arguments
    void foo( GENERAL_t a )
              ^
t.cpp:66:43: note: template is declared here
    template< template <typename T> class GENERAL_t,  // Note: GENERAL_t is either A<T> or B<T>
              ~~~~~~~~~~~~~~~~~~~~~       ^
3 errors generated.

此处,foo应采用class Aclass B的实例,但仅限于TA的模板参数Bint

2 个答案:

答案 0 :(得分:4)

  • 您尚未宣布T。它必须是模板参数。

  • T放入template <class T> class GENERAL_t

  • GENERAL_t是模板模板,因此需要模板参数。

  • 请不要将ALL_CAPS用于除宏以外的任何内容

这是工作代码:

template<class T, template <class> class General_t, 
          class = std::enable_if_t< std::is_same<T,int>::value >
        >
void foo(General_t<T> a)
{}

答案 1 :(得分:4)

bolov's answer在所有方面都是正确的。

但在这种情况下,您不需要is_same上的SFINAE。你可以在模板模板上模板:

template <template <class> class General>
void foo(General<int> ) { }