构造函数上指定的模板参数

时间:2015-07-12 11:11:59

标签: c++

这是我的代码:

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类型,我该如何使它工作? (我尝试编译时收到错误)

2 个答案:

答案 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}}