2013-02-11 55 views
1

下面一段代碼在GCC 4.5.3中編譯,但不在VS 2008和2010中編譯。這是由於VS編譯器錯誤還是標準禁止提供默認函數模板參數值?成員函數模板參數默認值

#include <cstdlib> 

struct Bar 
{ 
    enum Group{ A , B , C }; 
}; 

struct Foo 
{ 
    template<typename T> 
    static void getSome(typename T::Group = T::A); 
}; 

template<typename T> 
void Foo::getSome(typename T::Group) 
{ 
}; 

int main() 
{ 
    Foo::getSome<Bar>();   // Does not compile in VS 2008 & 2010 (compiles in gcc 4.5.3) 
    Foo::getSome<Bar>(Bar::C); // Compiles in VS 2008 and gcc 4.5.3 
    return EXIT_SUCCESS; 
} 

錯誤消息

prog.cpp(11) : error C2589: '::' : illegal token on right side of '::' 
prog.cpp(11) : error C2059: syntax error : '::' 

回答

6

它是一個MSVC錯誤。

該錯誤在於使用默認參數處理模板函數,正如您可能猜到的那樣。

他們的解決方法是提供所有功能參數。 (yuck)

確認here

+0

另一個蹩腳的方法是隻提供帶默認參數的方法作爲模板方法的重載,即提供一個額外的'getSome()',它將調用'getSome(T :: A)'。這也適用於MSVC。 – 2013-08-22 12:55:10

3

我認爲g++在編譯您的代碼段時遵循標準。

以下提取物應該是參照標準的右部(14.1.9節):在一後=

默認模板參數是一個模板參數(14.3)指定 模板參數。對於不是模板參數包(14.5.3)的任何類型的模板參數(類型,非類型, 模板),指定的默認模板參數可能爲 。可以在模板聲明中指定默認的 模板參數。 A 默認模板參數不應在 模板參數列表中指定,該模板參數列表將顯示在類別 類別的成員定義之外。不應在朋友類模板 聲明中指定默認的 模板參數。如果朋友函數模板聲明指定默認模板參數 ,則該聲明應爲定義,而 應爲 翻譯單元中函數模板的唯一聲明。