我已经和编译器斗争了一段时间。这是我的代码:
#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
编译