首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的命名空间类模板继承

C++中的命名空间类模板继承
EN

Stack Overflow用户
提问于 2014-05-19 10:46:21
回答 1查看 90关注 0票数 1

在之前的一个问题中,我问了class template inheritance in C++

我现在有了一个额外的关卡要添加!

考虑下面的代码。(假设成员定义存在且准确)

代码语言:javascript
复制
namespace Game
{
    namespace Object
    {
        template<typename T>
        class Packable
        {
        public:

            /**
             * Packs a <class T> into a Packet (Packet << T)
             * Required for chaining packet packing
             *************************************************/
            virtual sf::Packet& operator <<(sf::Packet& packet) = 0; // Work-horse, must be defined by child-class
            friend sf::Packet& operator <<(sf::Packet& packet, T &t);
            friend sf::Packet& operator <<(sf::Packet& packet, T *t);

            /**
             * Unpacks a <class T> from a Packet (Packet >> T)
             * Required for chaining packet unpacking
             *************************************************/
            virtual sf::Packet& operator >>(sf::Packet& packet) = 0; // Work-horse, must be defined by child-class
            friend sf::Packet& operator >>(sf::Packet& packet, T &t);
            friend sf::Packet& operator >>(sf::Packet& packet, T *t);

            /**
             * Unpacks a <class T> from a Packet (T <<= Packet)
             * Returns the <class T> for convienence
             *************************************************/
            //friend T& operator <<=(T t, sf::Packet& packet); // Returning reference to cut down on copying (they're already passing us our own copy)
            friend T& operator <<=(T &t, sf::Packet& packet);
            friend T* operator <<=(T *t, sf::Packet& packet);
        };
    }
}

这个Ship类继承自Game::Object::Packable

代码语言:javascript
复制
class Ship : public Game::Object::Base<Ship>, public Game::Object::Packable<Ship>
{
    public:
        Ship( void );
        //...

        // For packing and unpackinng packets
        sf::Packet& operator <<(sf::Packet& packet);
        sf::Packet& operator >>(sf::Packet& packet);
}

我们剩下的是下面的错误。

代码语言:javascript
复制
(null): "Game::Object::operator<<(sf::Packet&, Ship*)", referenced from:

我得出的结论是,它一定与名称空间的使用有关。如果我想保留名称空间,解决方案是什么?

下面是方法定义的摘录。我必须对名称空间执行dereference操作吗?(我甚至不认为这意味着什么,哈哈)

代码语言:javascript
复制
/**
 * Packs a <class T> into a Packet (Packet << T)
 * Required for chaining packet packing
 *************************************************/
template<class T>
sf::Packet& operator <<(sf::Packet& packet, T *t)
{
    // Call the actual one, but basically do nothing... this needs to be overrided
    return packet << *t;
}

template<class T>
sf::Packet& operator <<(sf::Packet& packet, T &t)
{
    // Call the pointer one, but basically do nothing... this needs to be overrided
    return packet << &t;
}

// ... other definitions etc.
EN

回答 1

Stack Overflow用户

发布于 2014-05-19 10:54:05

友元声明(非模板非成员)与友好函数模板不匹配。我建议您在类定义中提供实现:

代码语言:javascript
复制
    template<typename T>
    class Packable
        friend sf::Packet& operator <<(sf::Packet& packet, T &t) {
           return packet << t;
        }
    //...

这允许一个免费的非模板函数,它将由编译器按需生成。其他替代方案包括与模板或您所关心的模板专门化成为好友。

当然,您可以完全忽略友情,只提供名称空间级别的模板,因为它们是在公共函数…中实现的

相关信息:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23729016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档