4

これはVS 2009で問題なくコンパイルされますか? 私は愚かですか?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");
}
4

3 に答える 3

3

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

コメントから、修正は内部コンパイラビルドに対して既に行われているようです。

于 2011-04-28T21:00:26.030 に答える
1

このコードはコンパイルされるべきではありません - これは 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 からの関連する標準スニペット

[注: オーバーロードの解決によって選択された関数は、コンテキストに適しているとは限りません。関数のアクセシビリティなどのその他の制限により、呼び出しコンテキストでの使用が不適切になる可能性があります。]

于 2011-04-28T20:55:01.983 に答える
0

いいえ、あなたは愚かではありません。コードが壊れているため、拒否する必要があります。Comeau コンパイラ ( http://www.comeaucomputing.com/tryitout ) は正しく拒否します。

于 2011-04-28T20:56:20.747 に答える