2010-05-04 73 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