2011-06-18 132 views
3

我有以下代碼:模板參數

template<typename T, typename Allocator = std::allocator<T> > 
class Carray { 
    // ... 
    typedef T* pointer; 
    typedef pointer iterator; 
    // ... 
}; 

現在我想爲iterator_traits做局部的專業化。這似乎確定了我,但G ++ 4.4.5抱怨:

#include <iterator> 

namespace std { 
    template<typename T, typename Allocator> 
    struct iterator_traits<typename Carray<T, Allocator>::iterator> { // line 128 
     typedef T value_type; 
     typedef typename Allocator::difference_type difference_type; 
     typedef typename Allocator::reference reference; 
     typedef typename Allocator::pointer pointer; 
     typedef typename std::random_access_iterator_tag iterator_category; 
    }; 
} 

這是完全錯誤消息:

carray.h:128: error: template parameters not used in partial specialization: 
carray.h:128: error:   ‘T’ 
carray.h:130: error: ‘Allocator’ has not been declared 
carray.h:131: error: ‘Allocator’ has not been declared 
carray.h:132: error: ‘Allocator’ has not been declared 
+0

我不能重現這一點。你如何把它們放在一起? – Beta

+0

http://codepad.org/5gVzgYKc在Ubuntu 10.10上使用g ++ 4.4.5進行編譯,完整命令:'g ++ test.cpp' – orlp

+0

您是否在頭文件中定義了'Carray'文件,它專用於'iterator_traits'? – Nawaz

回答

9

你不應該需要一個專業化的一切都在這裏:iterator_traits已經專門用於指針類型,如果你最終得到的是一個類類型的迭代器,你可以在迭代器類中定義那些所需的typedef

問題是,爲了匹配主特殊化,編譯器需要使用模板使用的參數,將它們插入特化中,並查看它們是否匹配。

考慮以下簡化的場景會發生什麼:

template <typename T> struct S { typedef int type; }; 

template <typename T> 
struct Traits { }; 

template <typename T> 
struct Traits<typename S<T>::type> { }; 

如何編譯器應該知道什麼T插到S還是有些S<T>::type的真正含義,而不僅僅是int

問題是,嵌套typedef(::type)取決於模板參數(T)。當在函數參數列表或部分特化中出現這種情況時,不能推導出類型T(它是「非推導的上下文」)。

+0

那麼爲什麼它在鍵盤上編譯? – orlp

+0

鍵盤使用的是一個五年的編譯器,可能是相當多的錯誤?我不知道;我的筆記本上沒有舊的編譯器。 g ++ 4.5.1和Visual C++ 2010 SP1都直接拒絕它;鏗鏘3.0r133044發出詳細的警告,部分專業化將永遠不會使用。 –

+0

Codepad.org是一個代碼粘貼網站,它也可以編譯您的代碼進行測試,根據http://codepad.org/about使用g ++ 4.1.2和'-O -std = C++ 98 -pedantic - 錯誤 - 錯誤 - 錯誤 - 錯誤 - 錯誤 - 錯誤 - 缺少字段初始化器 - 寫入字符串 - 錯誤 - 不推薦使用 - 錯誤 - 未使用 - 錯誤 - 非虛擬 - 錯誤 - 錯誤 - 錯誤 - 宏 - 錯誤 - 長度= 0 -ftemplate-depth-128 -fno-merge-constants -fno -nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid -pch – orlp