2010-04-30 53 views
6

以下方法有什麼區別嗎?專用功能模板的語法

// approach 1 
namespace std 
{ 
    template<> 
    void swap<Foo>(Foo& x, Foo& y) // note the <Foo> 
    { 
     x.swap(y); 
    } 
} 

// approach 2 
namespace std 
{ 
    template<> 
    void swap(Foo& x, Foo& y) 
    { 
     x.swap(y); 
    } 
} 

我stumpled在這個當我試圖專注交換爲自己的字符串類型,發現swap<::string>不起作用,但對於一個完全不同的原因:)

+0

什麼類型':: string' name? – Potatoswatter 2010-04-30 22:55:35

+0

我自己的玩具字符串類型在全局命名空間中。 – fredoverflow 2010-04-30 23:59:42

回答

8

是的,有。但不是在那個特定的例子。如果該參數不推斷,它能夠有所作爲

template<typename T> void f(typename T::type t); 

你不能專注,沒有<type>,因爲它不能推斷出T是從參數列表。

struct MyType { typedef int type; }; 

// needs <MyType> 
template<> void f<MyType>(int t) { } 

當然,你的情況,這是有向圖<:說的意思一樣[造成您的問題。放置一個空間,如<   ::string>以避免該問題。

+0

+1感謝您的解釋!而這個digraph的東西太好玩了:) – fredoverflow 2010-04-30 20:38:11

+0

你知道標準中允許的語法是什麼嗎?我目前沒有看到它。 – 2010-04-30 20:42:26

+0

@gf你的意思是'f <..>'語法?它是一個模板id,它是一個id-expression,它是一個聲明符id。 – 2010-04-30 20:52:42

0

此外,你不需要專門研究這種情況,只是超載,很高興。

namespace std 
{ 
    void swap(Foo& x, Foo& y) 
    { 
     x.swap(y); 
    } 
} 
+0

如果你喜歡未定義的行爲,那麼是的:)你不能在'std'命名空間中重載。 – fredoverflow 2010-04-30 21:27:27