2009-09-13 49 views
6

考虑下面的代码:铸造指针作为模板参数:科莫和MSVC编译,GCC失败

template<int* a> 
class base {}; 

int main() 
{ 
    base<(int*)0> test; 
    return 0; 
} 

两个科莫和MSVC编译这个没有问题(除了科莫警告有关未使用的变量),而GCC失败在base<(int*)0> test;线,说明

In function `int main()': a casts to a type other than an integral or enumeration type cannot appear in a constant-expression

template argument 1 is invalid

究竟它是什么抱怨?谁是对的 - 这个代码是否应该编译?值得注意的是我的GCC版本是极其旧的(3.4.2),所以可能与它有关。谢谢。

+0

供参考:用gcc 4.4.1: TEST.CPP:6:错误:流延到不是整型或枚举型的类型中不能出现一个常数表达式 TEST.CPP:6:错误:模板参数1无效 test.cpp:6:错误:在';'之前的声明中的无效类型' token – jdehaan 2009-09-13 15:45:07

+0

谢谢jdehaan,所以我们知道这与我的版本无关。 – GRB 2009-09-13 15:45:55

+0

我欢迎你。我试着修改一下代码来编译它。轻微的变化不能说明问题... – jdehaan 2009-09-13 15:50:46

回答

8

draft standard(强调):

 
14.1.3 A non-type template-parameter shall have one of the following (option- 
    ally cv-qualified) types: 
    ... 
    --pointer to object, accepting an address constant expression desig- 
    nating a named object with external linkage, 
    ... 

显然,这是不合法的实例化一个模板,一个空指针,作为一个空指针没有指向一个“外部链接命名的对象” 。

+0

相关SO:http://stackoverflow.com/questions/275871/how-to-overcome-gcc-restriction-could-not-convert-template-argument-0-to-foo – Managu 2009-09-13 16:02:31

+1

+1!我尝试了一个指向int的指针作为参数,并且出现了以下错误(好于之前相当神秘的错误) 错误:'&a'不是'int *'类型的有效模板参数,因为'a'会没有外部联系 – jdehaan 2009-09-13 16:13:32

+1

这看起来很有希望,但我不认为这回答了为什么GCC和Comeau有所不同。例如,如果我更改为'base <(int*)1>',* Comeau和GCC都无法编译。此外,如果这个要求是来自'草案',那么我的GCC还没有编译它,但它已经有4年的历史了,所以如果在那个时候这个标准被添加到标准中,那么它就不会成为让GCC扼杀。 – GRB 2009-09-13 16:47:15