gpt4 book ai didi

c++ - 来自可变模板的模棱两可的成员请求

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:57 25 4
gpt4 key购买 nike

这对我来说毫无意义。 GCC 提示下面 main() 中对 processMsg() 的调用不明确,即使所有模板创建的 processMsg()电话被报告为候选人。我已经尝试用三种不同的方式实现这个可变参数模板原型(prototype),但它们都导致了同样的模棱两可的请求问题。当我将模板实现分解为不同的情况时,我确实更接近了,但是我可以编译器只能解析元组中的第一个查找。

我贴了一个小例子。我确定我遗漏了一些简单的东西......

#include <tuple>

//----------------------------------------------------------------------
//
class MessageBase
{
public:
MessageBase( const int _id ) : m_id( _id ) {}
virtual int getMessageID() const { return( m_id ); }

private:
const int m_id;
};

#define MESSAGE( NAME, VAL ) \
class Message##NAME : public MessageBase { \
public: \
Message##NAME() : MessageBase( VAL ) { } \
};

MESSAGE( One, 1 );
MESSAGE( Two, 2 );
MESSAGE( Ten, 10 );

//----------------------------------------------------------------------
//

template< typename T >
struct MyMessageInterface {
virtual void processMsg( const T& t ) { }
};

template< typename... T >
struct MyMessageHandler : public MyMessageInterface< T >...
{};

template< typename... T >
struct MyMessageHandler< std::tuple< T... > >
: public MyMessageInterface< T >...
{};


//----------------------------------------------------------------------
//
typedef std::tuple< MessageOne, MessageTwo, MessageTen > Foople;

int main()
{
MyMessageHandler< Foople > mmh;
mmh.processMsg( MessageOne() );
}

最佳答案

您可以将转发器添加到 MyMessageHandler 的特化中:

template< typename... T > 
struct MyMessageHandler< std::tuple< T... > >
: public MyMessageInterface< T >...
{
template< typename U >
void processMsg( const U& u )
{
MyMessageInterface< U >::processMsg( u );
}
};

Live example

您需要这样做(或 Jarod42 提议的)的原因是当名称不明确时,基类的虚拟方法对于派生类不可见。通常您会添加一个 using 声明来提取您需要的内容,但在您的情况下,转发器可能更容易。

关于c++ - 来自可变模板的模棱两可的成员请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com