基本クラス テンプレートから継承するクラス テンプレートがあります。
基本クラス テンプレートには、スーパー クラス内から呼び出したいメンバー関数テンプレートを持つデータ メンバーがあります。
メンバー関数テンプレートの呼び出しを明確にするために、template
キーワードを使用する必要this
があり、スーパー クラスで明示的に参照する必要があることはわかっています。
this->base_member_obj.template member_function<int>();
私が使用しているコードベースが の全体をインポートするというかなり不幸な間違いを犯したことnamespace std
と、私が呼び出そうとしているテンプレートメンバー関数がset
. フレームワークのどこかにが含まれているため、GCCは、メンバー関数を呼び出すのではなく、std::set
宣言しようとしていると判断します。std::set
set
GCC 4.7で「class std::set」の無効な使用に関するエラーがスローされる
エラーを示す例については、以下を参照してください。コメントアウトするusing namespace std
と、コードは正常にコンパイルされます。
using namespace std
残念ながら、コードベース全体を調べて、すべての呼び出しを削除し、すべての呼び出しを std 名前空間内の何かに接頭辞として付けることは現実的ではありません。std::
これを回避する他の方法はありますか?
#include <set>
using namespace std; // comment this out to compile fine
struct blah
{
template<typename T>
void set()
{ }
};
template<typename T>
struct base
{
blah b;
};
template<typename T>
struct super : base<super<T>>
{
void fun()
{
this->b.template set<int>(); // this line breaks
}
};
int main()
{
super<int> s;
s.fun();
return 0;
}