Fre*_*kle 5 c++ templates c++11
我有以下代码:
template<class T, int I=44> struct test {T j = I;};
template<int J> struct test<int, J> {int j = J;};
int main()
{
test<55> jj;
std::cout << jj.j << std::endl;
return(1);
}
Run Code Online (Sandbox Code Playgroud)
编译器(clang)只抱怨该行 test<55> jj
我不明白为什么?有工作吗?
如果它抱怨该行,为什么不抱怨第二个模板定义?
提前致谢.
消息是:
enable.cpp:17:8: error: template argument for template type parameter must be a type
test<55> jj;
^~
enable.cpp:9:16: note: template parameter is declared here
template<class T, int I=44> struct test
Run Code Online (Sandbox Code Playgroud)
问题是您还没有理解选择类模板专业化的方式.
你的专长:
template<int J> struct test<int, J> {int j = J;};
Run Code Online (Sandbox Code Playgroud)
不会创建只需传入单个int模板参数的模板.
test<55> jj; // doesn't work because there's no template<int J> struct test
Run Code Online (Sandbox Code Playgroud)
相反,它所做的是创建一个特殊化,template<class T, int I> struct test当模板参数template<class T, int I> struct test匹配特化时,将使用该特化,即test<int,J>.
test<int,55> jj; // uses the specialization template<int J> struct test<int, J>
Run Code Online (Sandbox Code Playgroud)
这是标准的关键引用:
在引用类模板特化的类型名称中(例如,
A<int, int, 1>)参数列表应与主模板的模板参数列表匹配.专门化的模板参数是从主模板的参数推导出来的. [强调补充]- 14.5.5.1 [temp.class.spec.match] p4
您似乎尝试将其设置int为默认类型,T同时为其设置独立的默认值I.我认为你的意图是能够指定一个类型和一个值,只指定一个类型并将44作为默认值,或者只指定一个值并将int作为默认类型.
不幸的是,我不知道如何指定这样的独立默认值.您可以指定默认值(template<class T=int, int I=44> struct test),但获取默认类型也需要接受默认值.
但是,如果您愿意使用第二个名称,那么您可以:
template <int I>
using test_int = test<int, I>;
Run Code Online (Sandbox Code Playgroud)
这将创建一个模板别名,以便您只需指定一个值:
test_int<55> jj;
Run Code Online (Sandbox Code Playgroud)
这最终将使用任何特殊化test<int, I>来解决是否存在显式特化或编译器是否生成隐式特化.