1

これは基本クラスです:

template <class T>
class DataLogger
{
        // ...
    public:
        void AddData(T Data);
        // ...
}

そして、これは派生クラスです:

#include "DataLogger.h"
#include <utility>

class Plotter : public DataLogger<std::pair<long double, long double>>
{
        // ...
    public:
        void AddData(long double x, long double y);
        // ...
}

// This method is supposed to wrap the original AddData() method
// which was defined in the base class
void Plotter::AddData(long double x, long double y)
{
    AddData(std::make_pair(x, y));  // LINE #29
}

指定されたエラーは次のとおりです。

29 行目: IntelliSense: "std::pair" から "long double" への適切な変換関数が存在しません

行 29: IntelliSense: 関数呼び出しの引数が少なすぎます

どうやら問題は、パブリックに定義されているにもかかわらず、派生クラスから基底クラスのメソッドにアクセスできないことです。

このコードを機能させるにはどうすればよいですか?

(私の IDE は Visual Studio 2010 です。)

4

4 に答える 4

5

fromAddDataベースはAddDatafrom派生クラスによって隠されています。呼び出しを明示的に修飾するDataLogger<std::pair<long double, long double>>::AddData(...)か、次のようにスコープに持ってきますusing DataLogger<std::pair<long double, long double>>::AddData;

于 2011-01-06T15:26:33.953 に答える
2

inAddData派生クラスAddDataは基本クラスの関数を非表示にするため、必要なのは、usingディレクティブを使用して後者を再表示することだけです。

class Plotter : public DataLogger<std::pair<long double, long double>>
{

public:
   //unhiding : bringing base class function into scope!
   using DataLogger<std::pair<long double, long double>>::AddData;

};

項目33を読んでください:ScottMeyersによるEffectiveC++から継承された名前を隠すことは避けてください。

于 2011-01-06T15:26:23.933 に答える
1

問題は、「パブリックに定義されていても、派生クラスから基本クラスのメソッドにアクセスできないこと」ではありません。

問題は、Plotter :: AddDataが基本クラスのAddDataではなく自分自身を(ペアで)呼び出そうとしていることです。

書くことで明示的に電話をかけることができます

void Plotter::AddData(long double x, long double y)
{
    DataLogger<std::pair<long double, long double>>::AddData(std::make_pair(x, y));
}
于 2011-01-06T15:27:27.757 に答える
1

スーパークラス メソッドを呼び出すには、 write ::AddData(x, y);. 新しいPlotter::AddDataメソッドは をDataLogger::AddData 非表示にします。

于 2011-01-06T15:24:49.753 に答える