このプライベートテンプレート機能がコンパイルされるのはなぜですか? - >コンパイラバグ対2009

StackOverflow https://stackoverflow.com/questions/5824819

  •  26-10-2019
  •  | 
  •  

質問

これは、2009年のVSで問題が発生しますか?私は愚かですか? GCCは、テンプレートがプライベートであるという警告を発します....?何が足りないの?

#include <iostream>

using namespace std;

class A
{
private:
    template<typename T>
    A& operator<<(const T & v)
    {
        cout << v << endl;
        return *this;
    }
};

int main()
{
   A a;
   a << 4;
   system("pause");
}
役に立ちましたか?

解決

このコードはコンパイルしてはいけません - これはVsのバグ(または愚かな拡張機能)です。 GCCもそれを拒否すべきです。オペレーターは、使用されるスコープでアクセスできません。

コモーはこれを正しく扱います:

"ComeauTest.c", line 28: error: function "A::operator<<(const T &) [with T=int]"
          (declared at line 14) is inaccessible
     a << 4;

編集:関連する標準スニペット、13.3/1から

注:過負荷解像度によって選択された関数は、コンテキストに適切であることを保証されていません。関数のアクセシビリティなど、その他の制限は、呼び出しコンテキストで不正に使用される可能性があります。

他のヒント

Microsoftはバグを認め、コンパイラの次の主要なリリースで修正されると主張しています(VC11/vs-hapever-is-after-2010として読みます - おそらくVC10/VS2010のサービスパックではありません):

コメントから、修正はすでに内部コンパイラビルドに加えられているように見えます。

いいえ、あなたは愚かではありません - それは壊れたコードであり、拒否されるべきです。コモーコンパイラ(http://www.comeaucomputing.com/tryitout)それを正しく拒否します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top