2016-05-10 39 views
0

我一直在奮戰編譯器一段時間了。這裏是我的代碼:Boost mpl list和auto_test_case_template編譯錯誤

#include <boost/test/unit_test.hpp> 
#include <boost/mpl/list.hpp> 

namespace MyMessageNamespace 
{ 
    class ParticularMessage 
    { 
     template <int N> 
     void SetSomething(int myValue) {}; 
    }; 
} 

template <typename MyMessageT> 
struct MyMessage 
{ 
    using MyMessageType = MyMessageT; 
}; 

using MyMessages = boost::mpl::list<MyMessage<MyMessageNamespace::ParticularMessage>>; 

BOOST_AUTO_TEST_CASE_TEMPLATE(MyTestCase, MyMessage, MyMessages) 
{ 
    typename MyMessage::MyMessageType message; 
    message.SetSomething<1>(20); 
} 

這是我得到的錯誤:

error: reference to non-static member function must be called: message.SetSomething<1>(20);

回答

3

您有2個問題(你會踢自己的第二個)。

首先,SetSomething是一個依賴模板類型。使用template關鍵字來糾正這一點,

BOOST_AUTO_TEST_CASE_TEMPLATE(MyTestCase, MyMessage, MyMessages) 
{ 
    typename MyMessage::MyMessageType message; 
    message.template SetSomething<1>(20); 
} 

第二,這表明SetSomething不可訪問,因爲它是私有的。解決這個問題的一種方法是使成員public:

class ParticularMessage 
{ 
public: 
    template <int N> 
    void SetSomething(int myValue) {}; 
}; 

以供參考,該編譯現在我(蘋果鐺7.3.0)

#include <boost/test/unit_test.hpp> 
#include <boost/mpl/list.hpp> 

namespace MyMessageNamespace 
{ 
    class ParticularMessage 
    { 
    public: 
     template <int N> 
     void SetSomething(int myValue) {}; 
    }; 
} 

template <typename MyMessageT> 
struct MyMessage 
{ 
    using MyMessageType = MyMessageT; 
}; 

using MyMessages = boost::mpl::list<MyMessage<MyMessageNamespace::ParticularMessage>>; 

BOOST_AUTO_TEST_CASE_TEMPLATE(MyTestCase, MyMessage, MyMessages) 
{ 
    typename MyMessage::MyMessageType message; 
    message.template SetSomething<1>(20); 
} 

編譯時-std=c++14

+0

我現在得到這個錯誤 錯誤:沒有匹配的成員函數調用'SetSomething' –

+0

@JonathonHill和你讓SetSomething公開? –

+0

是的,我做了:(你是否嘗試編譯這段代碼? –