ここでは、私はG ++ 4.4.6を使用していたテストコード"template"キーワードは不要ですか? [GCC /打ち鳴らす/コモのバグ?]
template <class T> void f()
{
T t;
t.f<T>(0); //compiles even without the "template" keyword, what am I missing?
}
class abc
{
public:
template <typename T>
void f (int){}
};
int main()
{
f<abc>();
}
です。ありがとう
P.S:私はかなり私の質問を編集しました。どうか気にしないでください。
EDIT:私はEDGの人にこの質問をしたし、これはマイク・ヘリック我々は--strictモードでエラーと同様に依存可能にする、任意のモードとして、これを診断行う
を言っていたものです名前検索(例えば、--dep_name、--parse_templates)。依存名検索はGNUエミュレーションモードでは無効になっているため、この場合はこのエラーは発生しません。
従属名の処理では、非クラスのプロトタイプインスタンス を有効にする必要があります(下記参照)。非クラスのプロトタイプインスタンシエーションと同様に、 依存名の参照を有効にすると、機能を考慮して記述されていない コードをコンパイルするとコンパイルエラーが発生する可能性があります。
依存名検索ルールでは、依存しない名前を とし、テンプレート定義の使用時点を参照し、その時点で非依存呼び出しで オーバーロード解決を実行する必要があります。 従属呼び出しの場合、考慮される名前のセットは、テンプレート定義の使用時に表示される のセットと、 がインスタンシエーションの時点で引数依存ルックアップによって表示される任意の名前です。 ビルトイン型には名前空間が関連付けられていないので、 ビルトイン型のみの呼び出しは、 テンプレート定義で表示される名前にのみ解決できます。さらに、従属ベースクラスの名前 は、修飾されていないルックアップでは表示されません。
以下は依存名ルックアップを使用する場合 に発生する最も一般的なコードの問題のいくつかを示しています。
template <class T> struct B {
void f();
};
template <class T> struct A : public B<T> {
X x; // error: X not visible yet (formerly an error in strict mode)
void g() {
f(); // error: B<T>::f not visible
this->f(); // must be written this way
h(1); // error: h(int) not visible using argument-dependent lookup
}
};
struct X {};
void h(int);
A<int> ai;
メンバ 'f'の名前をグローバル' f'の名前と共有しないように名前を変更すると、 'template'を指定せずにGCCでコンパイルされません。なぜそれが違いになるのか分かりません。 – interjay
GCCはよりスマートになっています。 :) – iammilind