6

基本クラス テンプレートから継承するクラス テンプレートがあります。

基本クラス テンプレートには、スーパー クラス内から呼び出したいメンバー関数テンプレートを持つデータ メンバーがあります。

メンバー関数テンプレートの呼び出しを明確にするために、templateキーワードを使用する必要thisがあり、スーパー クラスで明示的に参照する必要があることはわかっています。

this->base_member_obj.template member_function<int>();

私が使用しているコードベースが の全体をインポートするというかなり不幸な間違いを犯したことnamespace stdと、私が呼び出そうとしているテンプレートメンバー関数がset. フレームワークのどこかにが含まれているため、GCCは、メンバー関数を呼び出すのではなく、std::set宣言しようとしていると判断します。std::setset

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;
}
4

3 に答える 3

5

これを試して:

this->b.blah::template set<int>(); // this line breaks
于 2012-05-03T07:13:26.923 に答える