2012年(158)
分类: C/C++
2012-11-23 15:22:01
自己写代码总是按照标准中规中矩,所以有时候很多有趣的问题发现不了。
这次看别人的一段代码,发现一些平时没在意的东西,代码如下:
template
{
friend void bar( foo
};
template
{
}
int main( void )
{
foo
bar( a
);
}
link不通过,这里的 bar( a ) 竟然不能自动由参数类型 foo
原来编译器看到 friend void bar( foo
写成bar
正确的写法应该是:
template
template
template
{
friend void bar
};
template
{
}
int main( void )
{
foo
bar( a
);
}
网友评论2012-11-23 15:22:32
不明白
星星大哥说:“原来编译器看到 friend void bar( foo<T> a ) [T==int]这一句,认为 void bar( foo<int> a ) 是一个非模板函数,link时自然说void bar(struct foo<int>)找不到。”
这句话怎么理解? 为什么看到friend void bar( foo<T> a ) [T==int]这句 会认为 void bar( foo<int> a ) 是一个非模板函数 ?
即使没认出它是个模版函数,编译器也应该尝试其他名字解析途径,如果找到有一个模版函数的定义正好符合void bar( foo<int> a )的话,就应该把bar(a)当成是这个模版函数的一个特化才对啊,不应该说是找不到啊?