【问题标题】:Calling a function pointer within namespaces在命名空间中调用函数指针
【发布时间】:2016-04-20 08:25:18
【问题描述】:

所以我在我的主类中定义了一个函数指针,如下所示:

namespace Lab
{
    namespace Math
    {
        namespace Port
        {
         void main()
         {
          typedef void(*objfunptr)(int, int, const double[], double[], double[], int);
          objfunptr objfun= ObjectiveFunctions::ExampleObjFun;
          // Till Here it compiles fine but after calling the function we have error
          objfun(m, n, xPtr, fPtr, fjacPtr, td);
         }
        }
    }
}

我收到以下错误:

Error   16  error LNK2001: unresolved external symbol "public: static void __cdecl Lab::Math::Port::ObjectiveFunctions::ExampleObjFun ...

我的 ObjectiveFunctions 源和标头是这样定义的:

标题:

namespace Lab
{
    namespace Math
    {
        namespace Port
        {
        public class ObjectiveFunctions
        {
        public:
            static void ObjectiveFunctions::ExampleObjFun(int m, int n, const double x[], double f[], double fjac[], int fjacp);
        };
    }
 }
}

来源:

namespace Lab
{
     namespace Math
    {
        namespace Port
        {
          static void ExampleObjFun(int m, int n, const double x[], double f[], double fjac[], int fjacp){
         //Do whatever;
          }
        }
    }
}

请注意,如果我在同一个文件中编写函数,这整个事情都会起作用,但是当我添加命名空间并将目标函数分离到另一个类中时,我会得到这个问题。

我在网上看了很多,他们说你必须声明和定义函数,这样编译器才不会发疯。但我确实声明并定义了!我不知道会是什么问题。

【问题讨论】:

    标签: c++ managed-c++


    【解决方案1】:

    你的台词搞混了:

    包含类名的完整函数名需要放到源文件中:

    namespace Lab
    {
         namespace Math
        {
            namespace Port
            {
                           // V V V  
              static void ObjectiveFunctions::ExampleObjFun(int m, int n, const double x[], double f[], double fjac[], int fjacp){
             //Do whatever;
              }
            }
        }
    }
    

    【讨论】:

    • 那行不通@nvoigt。因为在这种情况下,我必须摆脱静态,而我不想这样做。
    • @Afshinzkh nvoigt 说您在定义中遗漏了类范围。这就是链接器找不到它的原因。您不必摆脱静态限定符。
    • 现在我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2011-01-11
    • 2014-02-24
    • 2016-01-10
    相关资源
    最近更新 更多