在尚未从模板声明的名称空间中使用函数

时间:2019-10-21 13:37:16

标签: c++

以下代码给我一个同时使用clang和gcc的错误'print2' is not a member of 'N'

#include <stdio.h>

struct Printer
{
    template<class T>
    void print(T t)
    {
        N::print2(*this, t);
    }
};

namespace N
{
    void print2(Printer& p, int v)
    {
        printf("%d\n", v);
    }
}

int main()
{
    Printer p;
    p.print(1);
}

如果删除命名空间N并使print2函数成为全局函数,它将起作用。为什么将函数放置在命名空间中时查找不一样?不幸的是,我无法将print2函数移到struct Printer之前,这显然是解决方案。

1 个答案:

答案 0 :(得分:2)

在这里,我只是在Printer之前声明该功能,然后再定义该功能的逻辑。

#include <stdio.h>

namespace N {
    void print2(int);
}

struct Printer
{
    template<class T>
    void print(T t)
    {
        N::print2(t);
    }
};

namespace N
{
    void print2(int v)
    {
        printf("%d\n", v);
    }
}

int main()
{
    Printer p;
    p.print(1);
}