2010-05-04 40 views
2

而具有不同版本的克++测试,下面的问题想出C++模板参数/类歧义

template<class bra> 
struct Transform<bra, void> : kernel::Eri::Transform::bra { 
     static const size_t ni = bra::A::size; 

bra::A被解释为kernel::Eri::Transform::bra::A,而不是由克++ 4.1.2模板参数。另一方面,g ++ 4.3正确。

根据标准什么应该是正确的行为?

同时,我稍微重构使问题消失。

+1

即使4.3正在做正确的事情,但不要重复名称可能是一个好主意,因为您会混淆读取代码的地狱。 – 2010-05-04 17:12:39

+0

@那是重构的一部分。我正在清理一些头脑风暴活动 – Anycorn 2010-05-04 17:16:06

+1

GCC4.5是固定的,并且像4.1一样,至少在我的测试中。 – 2010-05-04 17:25:21

回答

4

对我来说好像gcc 4.1.2是对的。 §14.6.1/ 7(ISO/IEC 14882,C++ 03)

在一类模板的定义或在显示的模板外的这样的模板的成员的定义定义,对于不依赖于模板参数(14.6.2)的每个基类,如果基类的名称或基类成员的名称与模板参数的名称相同,基类名称或成员名称隐藏了模板参数名称(3.3.7)。

+0

谢谢。你能给我提供一个标准链接吗?我于2000年4月19日发现了rev。这是否足够好(它解决了这个问题)? – Anycorn 2010-05-04 17:23:47

+0

@aaa:我指的是C++ 03,应该有一个最终的在线草稿。看到这里的链接等:http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents – 2010-05-04 17:26:57

+0

我总是很惊讶,当人们能够拿出标准中的确切段落:p – 2010-05-04 17:28:42