ポリモーフィズムによるC ++テンプレートメソッドのオーバーロードとクラスアクセス

助祭

私はかなり面白い行動だと思う何かに気づきました。

私ができるだけ一般的にしようとした次のサンプルコードを考えてみましょう。

class Base
{
public:
  virtual void func() {}
};

class Subclass : public Base
{
public:
  void func() {}
};

class ApplyingClass
{
public:
  static void callFunc(Base& base) { base.func(); }
private:
  template <class T>
  static void callFunc(T& t) { t.func(); }
};

int main()
{
  Subclass s;
  Base& b = s;

  // Error: ApplyingClass::callFunc(T& t) with T=Subclass is private.
  ApplyingClass::callFunc(s);

  // works
  ApplyingClass::callFunc(b);

  return 0;
}

main()内では、テンプレートメソッドが存在するため、コンパイラはテンプレート「ApplyingClass :: callFunc(T&t)」を関数呼び出し「ApplyingClass :: callFunc(s)」に適切であると見なしてスローするようです。クラスの外部からメソッドにアクセスできないため、エラーが発生します。

これは論理的に思えますが、メソッドのシグネチャが適合し、これが唯一のアクセス可能な適合メソッドであるため、コンパイラが引き続き「ApplyingClass :: callFunc(Base&base)」を使用しようとすると予想しました

私の主張をもう少し詳しく説明します。ApplyingClassからプライベートテンプレートメソッドを削除した場合、main()内の両方の関数呼び出しが有効になります。

私の質問は、これがC ++仕様の一部なのか、それともコンパイラ固有の動作なのかということです(これは、Visual Studio 2017 ver 15.5.7コンパイラを使用してテストされました)。

AndyG

ここでエラーを発行するのは有効なC ++です。

[class.member.lookup]を参照してください:

オーバーロードされた関数の名前が明確に見つかった場合、アクセス制御の前にオーバーロードの解決も行われます

したがって、最初に適切なオーバーロードが選択され(テンプレート)、次にアクセス制御が発生し、コンパイラエラーが発生します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ポリモーフィズムとC ++のクラステンプレートからのメソッドのオーバーライド

分類Dev

クラスメソッドとテンプレートのオーバーロード

分類Dev

異なるクラスローダー間でデフォルトのアクセサーメソッドをオーバーライドすると、ポリモーフィズムが壊れます

分類Dev

ポリモーフィズム-派生クラスのメソッドにアクセスする方法は?

分類Dev

クラステンプレートのテンプレートメソッドオーバーロード解決ルール

分類Dev

プライベート基本クラスは、子クラスのテンプレートフレンド関数とテンプレートメソッドを介したメンバーアクセスに影響します

分類Dev

数値セットC ++によるポリモーフィズムのメモリリーク

分類Dev

派生クラスの異なるメソッドによるポリモーフィズム

分類Dev

ヤーンクラスターモードでのSparkドライバー(およびそのYARNコンテナー)のフェイルオーバープロセスの仕組みに関するリソース/ドキュメント

分類Dev

MATLABのサブクラス内のスーパークラスプロパティセットメソッドのオーバーライド

分類Dev

メソッドシグネチャのベストプラクティス-オーバーロードとロングネーム

分類Dev

静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

分類Dev

オーバーロードされたメソッドのクラスはテンプレートと基本クラスを受け入れます-特定のメソッドをデフォルトにする方法は?

分類Dev

C ++によるポリモーフィズム

分類Dev

C ++ 11先物によるポリモーフィズム

分類Dev

Javaポリモーフィズムにおけるオブジェクトのフィールドアクセスとメモリ割り当て

分類Dev

C ++でテンプレートクラスにパラメータとして渡される基本クラスのメソッドをオーバーロードするにはどうすればよいですか?

分類Dev

Objectivecのスーパークラスからプライベートメソッドとプロパティをオーバーライドする方法

分類Dev

演算子<< C ++のテンプレートクラスのメンバー型のオーバーロード

分類Dev

ランタイムポリモーフィズムでのJavaメソッドアクセス

分類Dev

クラステンプレートの非メンバー演算のオーバーロード

分類Dev

テンプレート関数によるテンプレートクラスのオーバーロード

分類Dev

概念ベースのポリモーフィズムc ++による多重継承

分類Dev

C ++:演算子=ポリモーフィズムによるオーバーロード

分類Dev

C ++演算子のオーバーロードテンプレートクラス

分類Dev

djangoテンプレートでの外部メソッドアクセス

分類Dev

フレンドテンプレート演算子<<はクラスのプロテクトメンバーにアクセスできません

分類Dev

テンプレートクラスのCythonC ++静的メソッド

分類Dev

クラス内のテンプレートメソッド

Related 関連記事

  1. 1

    ポリモーフィズムとC ++のクラステンプレートからのメソッドのオーバーライド

  2. 2

    クラスメソッドとテンプレートのオーバーロード

  3. 3

    異なるクラスローダー間でデフォルトのアクセサーメソッドをオーバーライドすると、ポリモーフィズムが壊れます

  4. 4

    ポリモーフィズム-派生クラスのメソッドにアクセスする方法は?

  5. 5

    クラステンプレートのテンプレートメソッドオーバーロード解決ルール

  6. 6

    プライベート基本クラスは、子クラスのテンプレートフレンド関数とテンプレートメソッドを介したメンバーアクセスに影響します

  7. 7

    数値セットC ++によるポリモーフィズムのメモリリーク

  8. 8

    派生クラスの異なるメソッドによるポリモーフィズム

  9. 9

    ヤーンクラスターモードでのSparkドライバー(およびそのYARNコンテナー)のフェイルオーバープロセスの仕組みに関するリソース/ドキュメント

  10. 10

    MATLABのサブクラス内のスーパークラスプロパティセットメソッドのオーバーライド

  11. 11

    メソッドシグネチャのベストプラクティス-オーバーロードとロングネーム

  12. 12

    静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

  13. 13

    オーバーロードされたメソッドのクラスはテンプレートと基本クラスを受け入れます-特定のメソッドをデフォルトにする方法は?

  14. 14

    C ++によるポリモーフィズム

  15. 15

    C ++ 11先物によるポリモーフィズム

  16. 16

    Javaポリモーフィズムにおけるオブジェクトのフィールドアクセスとメモリ割り当て

  17. 17

    C ++でテンプレートクラスにパラメータとして渡される基本クラスのメソッドをオーバーロードするにはどうすればよいですか?

  18. 18

    Objectivecのスーパークラスからプライベートメソッドとプロパティをオーバーライドする方法

  19. 19

    演算子<< C ++のテンプレートクラスのメンバー型のオーバーロード

  20. 20

    ランタイムポリモーフィズムでのJavaメソッドアクセス

  21. 21

    クラステンプレートの非メンバー演算のオーバーロード

  22. 22

    テンプレート関数によるテンプレートクラスのオーバーロード

  23. 23

    概念ベースのポリモーフィズムc ++による多重継承

  24. 24

    C ++:演算子=ポリモーフィズムによるオーバーロード

  25. 25

    C ++演算子のオーバーロードテンプレートクラス

  26. 26

    djangoテンプレートでの外部メソッドアクセス

  27. 27

    フレンドテンプレート演算子<<はクラスのプロテクトメンバーにアクセスできません

  28. 28

    テンプレートクラスのCythonC ++静的メソッド

  29. 29

    クラス内のテンプレートメソッド

ホットタグ

アーカイブ