2012-12-18 164 views
0

Test::load應該將數據(通過名稱或索引描述)加載到傳遞的引用中。作爲第三個參數,加載失敗時會有一個默認值(數據從文件加載)。新構造的對象作爲默認模板函數參數

struct Test 
{ 
    template <typename ValueType, typename DefaultValueType> 
    void load(const char * c, ValueType & a, DefaultValueType b) 
    { 
     std::cout << "1"; 
    } 

    template <typename ValueType, typename DefaultValueType> 
    void load(int i, ValueType & a, DefaultValueType b) 
    { 
     std::cout << "2"; 
    } 
}; 

我需要因爲我特別需要字符串和自定義類型都ValueTypeDefaultValueType。 當我想使用默認構造類型作爲從ValueType推導出的默認第三個參數(在const char *版本中)時發生問題。

template <typename ValueType, typename DefaultValueType> 
void load(const char * c, ValueType & a, DefaultValueType b = ValueType()) 
{ 
    std::cout << "1"; 
} 

我得到expects 3 arguments錯誤(vs2010)。

爲什麼它不起作用?我需要做workaroud來完成這項工作。


這裏充滿如果「工作」的代碼有人有興趣玩一圈

#include <iostream> 

struct Test 
{ 
    template <typename ValueType, typename DefaultValueType> 
    void load(const char * c, ValueType & a, DefaultValueType b/* = ValueType()*/) 
    { 
     std::cout << "1"; 
    } 

    template <typename ValueType, typename DefaultValueType> 
    void load(int i, ValueType & a, DefaultValueType b) 
    { 
     std::cout << "2"; 
    } 

    //Workaround 
    template<typename ValueType> 
    void load(const char * c, ValueType & v) 
    { 
     load(c,v,ValueType()); 
    } 
}; 

int main() 
{ 
    Test t; 
    float f; 

    //This is standard behavior 
    t.load("bar", f, 0.0f); 

    //I want this to be possible call 
    t.load("bar", f); 
} 

回答

2

您正在尋找局部template specialization。然而,部分模板專門化只能用於類而不能用於函數。對於函數,您通過重載來解決問題,這正是您在解決方法中所做的。

這是一個writeup爲什麼模板函數有重載,而不是專業化。

+0

哦,我知道,我總是忘記它,因爲它寫的感覺很「自然」......而這次的錯誤信息是對我的暗示......非常感謝! – relaxxx

+0

*對我來說不是一個提示 – relaxxx