2012-02-07 59 views
1

我了解到:nontypes模板参数

  • 无类型模板参数进行一些限制。一般来说,它们可以是常量整数值(包括枚举)或指向具有外部链接的对象的指针。

所以我做了下面的代码

template <char const* name> 

class MyClass { 
    … 
}; 

char const* s = "hello"; 

MyClass<s> x;   // ERROR: 

此代码没有工作,产生错误's' is not a valid template argument

我的第二个代码也没有工作

2.

template <char const* name> 
class MyClass { 
    … 
}; 

extern char const *s = "hello"; 

MyClass<s> x;  //error 's' is not a valid template argument` 

但奇怪的是这个代码是罚款

template <char const* name> 
class MyClass { 
    … 
}; 

extern char const s[] = "hello"; 

MyClass<s> x;  // OK 

请告诉什么是在所有这三个码的发生?

也告诉如何纠正错误,使其他两个代码也工作。

+2

啊,旧的'const *'vs'* const'栗子... – 2012-02-07 08:20:10

回答

1

here:“模板参数列表中提供的非类型模板参数是一个表达式,其值可以在编译时待定”。

你得到了一个问题,因为你的char指针在前两个例子中并不是真正的常量。看看这个简单的例子:

int main() { 
     char const *c = "foor"; 
     std::cout << "c: " << c << std::endl; 
     c = "bar"; 
     std::cout << "c: " << c << std::endl; 
} 

,这将给你

c: foo 
c: bar 
+0

C风格的演员是完全多余的。 'c'不是'const',它只是指向'char'的'const'数组。 – 2012-02-07 08:40:01

+0

@MatthieuM:你是对的,这是一个残余。编辑。 – ezdazuzena 2012-02-07 08:44:26

+0

@ezdazuzena:正如你所说,我得到了一个问题,因为字符指针在前两个例子中并不是真正的常量。但是使它们保持不变仍然不起作用。编译器显示相同的错误。 “你的意思是”模板参数列表中提供的非类型模板参数是一个表达式,它的值可以在编译时确定“,以及它们如何与只有int和指向外部链接的指针的指针相关联。漂浮等 – 2012-02-07 10:38:05

0

我认为这个问题是在这里: 甚至

为const char * const的P = “你好”;

只定义一个存储内存地址的指针变量,编译时无法确定内存的值。 但是

const char pp [] =“hello”;

编译器会知道何时编译内存是“hello”,而不是指向其他地方的指针。 这就是为什么

的printf( “P =%P,& P =%P \ n” 个,P,& P);

将获得相同的值。 但是

printf(“pp =%p,&pp =%p \ n”,pp,&pp);

不会显示相同的值。