c++ 命名空间中的前向声明

k2arahey  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(202)

请考虑以下场景:
"A.cpp":

void fun() { std::cout << "fun() global\n"; }

"B.cpp":

namespace N
{
    void f()
    {
        std::cout << "f() in N\n";
        
        void fun(); // forward declaration
        fun();
    }
}

N::f();从其他文件(比如"C.cpp")调用时,编译器会为fun()抛出一个"未定义符号"错误。
如何在不对"A.cpp"进行任何更改的情况下修复此问题?

n8ghc7c1

n8ghc7c11#

如何在不对“A.cpp”进行任何更改的情况下修复此问题?
您需要在 global namespace 中而不是在命名空间N内部正向声明fun。这可以通过将声明void fun();移到N外部来完成,如下所示:

  • B氏杆菌cpp**
void fun(); //this is a forward declaration in global namespace 
namespace N
{
    void f()
    {
        std::cout << "f() in N\n";
        
        //no declaration needed here
        fun();
    }
}

Working demo

相关问题