2016-05-10 3 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 public? –

+0

Да, я сделал :(Вы пытались скомпилировать этот код? –

Смежные вопросы