5

私はここでこの前の質問と同じ問題を抱えていました: テンプレートと継承を使用したC++での宣言されていない識別子の使用

要約すると、子クラスからテンプレートクラスの保護された属性にアクセスしようとします。これを行うための説明された方法はthis->attribute、だけではなくを使用することattributeです。問題は、Visual Studio 2012で、プログラムを正しくコンパイルして実行するために、変数参照の前にthis->を追加する必要がなかったのはなぜだろうと思っていました。また、OSX上のgccまたは他のコンパイラでその機能を使用する方法があるかどうか疑問に思いました。

編集:これは、VisualStudio2012でこれをテストするために使用したコードです。

//file a.h

template<class T>
class a
{
public:
    a(){value = 2;};
protected:
    T value;
};

template<class T>
class b: public a<T>
{
public:
    T getValue(){return value;};
};

//file main.cpp
#include <iostream>
#include "a.h"
using namespace std;
int main()
{
    b<int> myTest;
    cout<<myTest.getValue();
    system("pause");
    return 0;
}

これはg++を使用してコンパイルされませんが、VisualStudio2012を使用してコンパイルされます。

4

1 に答える 1

4

この場合に適用される引数依存の検索ルールを説明する標準の部分は、§14.6.2/3 であり、次のように述べられていると思います。

クラス テンプレートまたはクラス テンプレートのメンバーの定義で、クラス テンプレートの基本クラスがテンプレート パラメーターに依存している場合、基本クラスのスコープは、クラスの定義の時点でも、非修飾名の検索中に調べられません。テンプレートまたはメンバー、またはクラス テンプレートまたはメンバーのインスタンス化中。

基本クラスはテンプレート パラメーターに依存するため、依存する基本クラスのスコープを調べるべきではありません。ただし、一部のコンパイラではこれが間違っていました。たとえば、GCC は追加の依存基底クラス スコープ ルックアップを行っていましたが、これはバージョン 4.7 でのみ修正されました(Bug# 2416329131 )。なぜVisual Studioコンパイラがそれを許可するのかについての洞察はありません。しかし、そうであれば、この点に関しては明らかに標準に準拠していません。そのバグに依存するべきではなく、依存する同様のバグを持つコンパイラを探すべきではありません。

于 2013-01-26T06:18:18.837 に答える