【问题标题】:virtual methods and template classes虚方法和模板类
【发布时间】:2011-02-01 15:07:09
【问题描述】:

我解决了一个问题,我认为是一个非常具体的问题。

我有 2 个类,一个 B aseclass 和一个 D 派生类(来自 B aseclass)。 B 是一个模板类(或类模板),并有一个纯虚方法 virtual void work(const T &dummy) = 0; D 派生类应该重新实现这一点,但由于 D 派生自 B 而不是 D 是另一个模板类,编译器对我吐口水说虚函数和模板不能同时工作。

任何想法如何完成我想要的?

感谢任何想法和想法,特别是如果您已经解决了这个问题

这个类是按原样固定的,我不能在不破坏现有代码库的情况下编辑它

template <typename T>
class B {
public:
...
virtual void work(const T &dummy) = 0;
..
};

以int*为例

class D : public B<int*>{
...
virtual void work(const int* &dummy){ /* put work code here */ }
..
};

编辑:编译器告诉我,void B&lt;T&gt;::work(const T&amp;) [with T = int*]D

中是纯虚拟

【问题讨论】:

标签: c++ templates virtual


【解决方案1】:

您将 const 放置在错误的位置。试试

virtual void work(int* const &dummy){ /* put work code here */ }

const int*int const* 相同,即它将 const 与 int 而非指针相关联。

【讨论】:

    【解决方案2】:

    你有 const 和 reference 的混合问题。以下编译:

    template <typename T>
    struct B {
    virtual void work(T dummy) = 0;
    };
    
    struct D : public B<int*>{
    virtual void work( int* dummy){ /* put work code here */ }
    };
    
    int main() {
        D d;
        d.work( 0 );
    }
    

    【讨论】:

      【解决方案3】:

      哪个编译器?

      g++ 4.4 没有抱怨:

      template <typename T>
      class B {
      public:
      virtual void work(const T &dummy) = 0;
      };
      class D : public B<int*>{
      virtual void work(const int* &dummy){ /* put work code here */ }
      };
      
      int main(){return 0;}
      

      编辑:当然——错误只在实际实例化 D 时出现,通过移动 const 关键字修复:

      template <typename T>
      class B {
      public:
      virtual void work(const T &dummy) = 0;
      };
      class D : public B<int*>{
      virtual void work(int* const &dummy){ /* put work code here */ }
      };
      
      int main(){D d;return 0;}
      

      【讨论】:

      • @Douglas 因为你没有使用模板。
      【解决方案4】:

      试试:

      int* const& dummy
      

      【讨论】:

      • 这真的很重要吗,我的意思是我像上面那样做,因为我学习了 C++,到目前为止没有人抱怨...到目前为止... 是否有一些 const 的文档和最佳实践?
      • 这是“指向 int 的 const 指针”和“指向 const int 的指针”的区别
      • 加:const是绑定到左边的,除非左边什么都没有,那么就绑定到右边(这是最常见的用法)
      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2016-09-28
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多