这是我的代码:
class test{
public:
template<int B>
test(const char(&a)[B]){
std::cout<<B<<std::endl;
}
};
int main(int argc, char** argv) {
test t("test");
return 0;
}
输出:
5
我正在做一些研究并且发现了这段代码。它将计算字符数(精确到-1)。我想知道指定int B
的目的。在模板参数内部,如果我有类似的东西,它会工作吗?
class test{
public:
template<char B>
test(){
}
};
int main(int argc, char** argv) {
test t(); //error, how to make it work?
return 0;
}
我的问题是:
从我的第一个例子开始,它是如何准确计算字符数的?什么是在模板构造函数中指定类型的目的,比如我的示例编号2,如果我有一个char类型,我该如何使它工作? (我尝试编译时收到错误)
答案 0 :(得分:1)
在第一个示例中,Http\Kernel
可以被视为"test"
。从那里可以将模板构造为const char s[5] = "test"
,但由于const char(&a)[5]
用于模板定义,因此&#34; 5&#34;被抓取为B
的值。
你的第二个例子/问题并不清楚。
答案 1 :(得分:0)
C ++中的字符串文字具有常量字符数组的类型。因此字符串文字const char[5]
具有类型test t();
(字符串文字包括终止零)。
因此,在第一个程序中,编译器可以确定模板参数,因为数组(字符串文字)是通过引用传递的。
在第二个程序中这个声明
test
是函数的声明,其返回类型为class test{
public:
template<char B = 'A'>
test(){
}
};
int main(int argc, char** argv) {
test t;
return 0;
}
且没有参数。
如果你想在第二个程序中声明类test的对象,你可以编写程序,例如以下方式
{{1}}