我的 C++ 模板失败:非模板结构的显式特化
My C++ template failed: explicit specialization of non-template struct
我在 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.
真奇怪,我的"struct is_placeholder"真的是模板吧?为什么说不是?
如何修正我的程序?谢谢!
您似乎混淆了类型和对象。
例如,您在尝试使用 t
实例化模板时犯了一个错误,它不是类型:
return is_placeholder<t>()::value;
^^^^^^
here
此外,您已将 check
定义为接受单个参数的函数,但您在调用期间不提供任何参数。
我建议你做下一个:
制作 _1
和 _2
类型:
using _1 = place_holder<1>;
using _2 = place_holder<2>;
改变check
函数如下:
template<typename T>
auto check() {
return is_placeholder<T>::value;
}
然后用作:
auto i = check<_1>();
这里是固定版本:WANDBOX
我在 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.
真奇怪,我的"struct is_placeholder"真的是模板吧?为什么说不是?
如何修正我的程序?谢谢!
您似乎混淆了类型和对象。
例如,您在尝试使用 t
实例化模板时犯了一个错误,它不是类型:
return is_placeholder<t>()::value;
^^^^^^
here
此外,您已将 check
定义为接受单个参数的函数,但您在调用期间不提供任何参数。
我建议你做下一个:
制作
_1
和_2
类型:using _1 = place_holder<1>; using _2 = place_holder<2>;
改变
check
函数如下:template<typename T> auto check() { return is_placeholder<T>::value; }
然后用作:
auto i = check<_1>();
这里是固定版本:WANDBOX