Boost mpl列表和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);
}

这是我得到的错误:

错误:必须调用对非静态成员函数的引用:message.SetSomething<1>(20);

您有两个问题(您将为第二个问题而自责)。

首先,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) {};
};

作为参考,这现在为我编译(appleclang7.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 编译

最新更新