これはさらに詳細なフォローアップです: この質問
次のコードを検討してください。
template <typename T>
class A {
public:
template <typename T2>
const T2* DoSomething() { ... }
};
template <typename T>
class B : public A<T> {
public:
const int* DoSomethingElse() {
return this->DoSomething<int>(); // Compiler wants 'template' keyword here:
// return this->template DoSomething<int>();
}
};
なぜこれはコンパイルされないのですか?規格の関連セクションが14.2/4であることは理解していますが、これが機能しない理由の要点を理解しているかどうかはわかりません。誰かがそのセクションの文言を分解して、これが機能しない理由を説明できますか?さらに、(一般的に)どのような状況でテンプレートキーワードを省略できるかを説明できますか?
C ++ 11では、次のコードがコンパイルされることに注意してください。
template <typename T>
class A {
public:
template <typename T2>
const T2* DoSomething() { ... }
};
class B {
public:
scoped_ptr<A<int>> var_;
const int* DoSomethingElse() {
return var_->DoSomething<int>();
}
};
違いは何ですか?