0

このサンプルテンプレートがあるとしましょう:

template<class T>
class Wrapper
{
virtual T* ReturnPtr() = 0;
};

そして、私はそれから継承します:

class Buffer; //some class
class BufferWrapper : public Wrapper<Buffer>
{
virtual Buffer* ReturnPtr(); //<< (1.)
}
  1. これは適切に行う方法ですか?このように書くと、インテリセンスエラーは発生しませんが、どこかにReturnPtr()を書くと、「オブジェクトには、メンバー関数と互換性のない型修飾子があります」と表示されます。
  2. これは、そのような仮想メソッドを使用することが不可能であることを意味しますか?
4

1 に答える 1

3

constIntellisenseは、オブジェクトで非関数を呼び出しているときにそのメッセージを表示しますconst。ご覧のとおり、ReturnPtrは非定数です。このメッセージが表示される理由は一般に2つあります。ReturnPtr1つ目は、次のタイプのconstオブジェクトを呼び出そうとしている場合ですBufferWrapper

const BufferWrapper bw;
bw.ReturnPtr(); // Can't call non-const member function on const object

2つ目は、オブジェクトがクラスのデータメンバーであり、そのクラスのメンバー関数内からBufferWrapperオブジェクトを呼び出している場合です。ReturnPtrconst

struct SomeClass
{
  BufferWrapper bw;

  void SomeClass::SomeFunc() const
  {
    bw.ReturnPtr(); // Cannot call non-const member function here
  }
}
于 2013-02-10T20:04:27.857 に答える