2012-03-19 26 views
1

關於這個問題有很多問題,但他們都不是我的問題的解決方案。我不認爲這真的是一個Boost :: Variant問題;我很確定我只是以不正確的方式使用模板。我可以去掉代碼,這樣你就可以編譯它並自己查看問題,這很簡單 - 即使它看起來就在那裏,我仍然從gcc那裏得到一個'no function call'錯誤。我可能在做一些愚蠢的事情,但我似乎無法看到我做錯了什麼。Boost :: Variant - 「沒有匹配的調用函數」

#include <boost/variant.hpp> 

typedef boost::variant<int, std::string> Data; 

struct A 
{ 
    template <typename T> T data() { return boost::get<T>(m_data); }; 
    private: 
     Data m_data; 
}; 

struct B 
{ 
    template <typename T> T data() { return m_a.data(); }; 
    private: 
    A m_a; 
}; 

int main (int argc, char *argv[]) 
{ 
    return 0; 
}; 
+2

不應該是'm_a.data ();'? – Asha 2012-03-19 08:34:03

+0

這段代碼本身並不會產生編譯器錯誤(至少在Visual Studio 2010中,但我認爲它不會在任何符合的編譯器中產生錯誤)。爲了顯示錯誤,你應該在某處調用'B :: data'函數。例如在'main'中添加一個變量'B'並且在其上調用'data' ... – 2012-03-19 08:46:44

回答

0

由於阿莎的評論指出,你應該寫:

template <typename T> T data() { return m_a.data<T>(); }; 
struct B

這是必要的,因爲模板參數不會根據返回類型(僅基於參數)自動減去。

+1

當我今天早上醒來時,我知道問題是什麼問題。這只是我工作方式太多的時間之一,開始犯了一個非常愚蠢的錯誤。我只是希望這不是一個這麼簡單的問題,因爲我知道的更好。 – Richard 2012-03-19 17:30:39