重载命名空间中的函数模板

发布于 2024-11-02 03:23:48 字数 843 浏览 1 评论 0原文

为什么 GCC 4.4 无法编译?

template<typename T>
class A {
public:
    void foo () {

    }

private:
    T x;
};

namespace Ns {
template<typename T>
void do_it (A<T> a) {
    a.foo ();
}
};

template<typename T>
void myfun (T x) {
    Ns::do_it (x);
}

template<typename T>
class B {
public:
    void bar () {

    }

private:
    T x;
};

namespace Ns {
template<typename T>
void do_it (B<T> b) {
    b.bar ();
}
};

int main () {
    A<int> a;
    B<int> b;

    myfun (a);
    myfun (b); // error: no matching function call to do_it(B<int>&)

    return 0;
}

肯定和do_it的命名空间有关。当我删除它周围的命名空间时,它会编译。

背景:我正在构建一组可与许多不同容器类一起使用的函数。为了统一处理不同的接口,我使用为每个容器类重载的独立函数。这些函数应放入命名空间中,以避免它们使全局命名空间混乱。

B 的定义应被视为来自与 A 不同的头文件,因此不能选择重新排序。

Why does this fail to compile with GCC 4.4?

template<typename T>
class A {
public:
    void foo () {

    }

private:
    T x;
};

namespace Ns {
template<typename T>
void do_it (A<T> a) {
    a.foo ();
}
};

template<typename T>
void myfun (T x) {
    Ns::do_it (x);
}

template<typename T>
class B {
public:
    void bar () {

    }

private:
    T x;
};

namespace Ns {
template<typename T>
void do_it (B<T> b) {
    b.bar ();
}
};

int main () {
    A<int> a;
    B<int> b;

    myfun (a);
    myfun (b); // error: no matching function call to do_it(B<int>&)

    return 0;
}

It must have something to do with the namespace of do_it. When I remove the namespace around it, it compiles.

Background: I am building a set of functions that may be used with many different container classes. To handle the different interfaces uniformly I use freestanding functions that are overloaded for each of the container classes. These functions shall be put into a namespace to avoid cluttering the global namespace with them.

The definitions for B shall be thought of as coming from a different header file than those for A so reordering is not an option.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

守不住的情 2024-11-09 03:23:48

原因是在调用时只完成了 ADL。其他函数查找仅在 myfun 函数模板的定义中完成。

在该定义上下文中,仅声明接受 Ado_it 重载。

编辑:如果您想获得这方面的标准参考,请参阅 [temp.dep.candidate] 和 [temp.res]p1。

The reason is that only ADL is done at the point of the call. Other function lookups are only done in the definition of the myfun function template.

And at that definition context, only the do_it overload accepting the A<int> is declared.

Edit: If you want to have a Standard reference for this, refer to [temp.dep.candidate] and [temp.res]p1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文