c++ - 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set

标签 c++ templates stl

我有一个继承自基类模板的类模板。

基类模板有一个数据成员和一个我想从父类(super class)中调用的成员函数模板。

我知道为了消除对成员函数模板的调用的歧义,我必须使用 template关键字,我必须明确提及 this在父类(super class)中。

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

这一切都很好,只是我使用的代码库犯了一个相当不幸的错误,即导入了整个 namespace std。 ,我试图调用的模板成员函数称为 set .框架中的某处 std::set包含在内,这导致 GCC 认为我正在尝试声明 std::set而不是调用成员函数 set .

GCC 4.7 抛出错误invalid use of '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;
}

最佳答案

试试这个:

this->b.blah::template set<int>(); // this line breaks

关于c++ - 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426428/

相关文章:

css - 使 Dojo 或 Ext JS4 小部件的外观和行为类似于 Kendo UI。要求会有多高?

c++ - 如何检查类中是否存在成员名称(变量或函数),是否指定类型?

c++ - 从 vector 返回底层数组

c++ - 从 Base* 的容器向下转换为 Derived* 而无需显式转换

java - Android 的最佳 OpenGL ES 语法

c++ - 如何从压缩图像文件中打开某些区域而不将完整图像文件加载到内存中?

c++ - "No matching function for call to"模板 C++

c++ - std::list 的排序成员函数使用哪种排序算法?

c++ - 使用 mingw-w64 工具链时,以 Release模式链接的 Regex Boost 库会发出 "duplicate section has different size"警告

c++ - 比较警告的可能解决方法