我的C ++模板失败:非模板结构的显式特化

时间:2017-07-23 08:49:04

标签: c++ templates struct specialization explicit

我在mac上使用了clang并且拥有:

$cat my.cpp
#include<type_traits>
using namespace std;
template<int i>
struct place_holder{};
place_holder<1> _1;
place_holder<2> _2;
template<typename T>
struct is_placeholder:public integral_constant<int,0>{};
template<int i>
struct is_placeholder<place_holder<i> >:public integral_constant<int,i>{};
template<typename T>
int check(T&& t){
    return is_placeholder<t>()::value;
}
int main(){
    int i=check<_1>();
    return 0;
}

最后一行无法编译:

my.cpp:13:27: error: template argument for template type parameter must be a type
    return is_placeholder<t>()::value;
                        ^
my.cpp:7:19: note: template parameter is declared here
template<typename T>
                ^
my.cpp:16:11: error: no matching function for call to 'check'
    int i=check<_1>();
        ^~~~~~~~~
my.cpp:12:5: note: candidate function template not viable: requires single argument 't', but no arguments were
    provided
int check(T&& t){
    ^
2 errors generated.

真奇怪,我的&#34; struct is_placeholder&#34;真是个模板吧?为什么说它不是?

如何更正我的计划?谢谢!

1 个答案:

答案 0 :(得分:1)

似乎你稍微混淆了类型和对象。

例如,您尝试使用t实例化模板时出错,这不是类型:

return is_placeholder<t>()::value;
                    ^^^^^^
                     here

此外,您已将check定义为接受单个参数但在调用期间不提供参数的函数。

我建议你做下一个:

  1. 制作_1_2类型:

    using _1 = place_holder<1>;
    using _2 = place_holder<2>;
    
  2. 更改check功能如下:

    template<typename T>
    auto check() {
        return is_placeholder<T>::value;
    }
    
  3. 然后用作:

    auto i = check<_1>();
    

    以下是固定版本:WANDBOX