从静态类调用函数

时间:2015-02-26 15:09:47

标签: c++

因此标题有点误导。但它正是我想要做的。我创建了一个小案例场景。这种情况适用于Visual Studio,但在Mingw上尝试时,我收到错误。情况就是这样。我试图从静态方法调用cpp文件中的函数,该方法驻留在不同的cpp文件中。这只是粗略的代码,可以解释我的观点。

文件:foo.h中

#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED

#include <iostream>

struct foo
{
    int someMethod();
};


#endif // FOO_H_INCLUDED

档案:foo.cpp

#include "foo.h"

int someFunction()
{
    std::cout << "SomeFunction";
    return 0;
}

int foo::someMethod()
{
  std::cout << "foo called";
  return 0;
}

文件:main.cpp中

void myfunction()
{

}

struct bar
{
    static void somebar()
    {
       someFunction(); //error: 'someFunction' was not declared in this scope
       myfunction(); //OK

    }
};

int main()
{

}

我的问题是为什么我在someFunction()上收到错误; 这是我的编译器输出

g++.exe -Wall -std=c++98 -g -std=c++11 -I..\..\..\mingw64\include -c C:\Users\peeru\TestCodeBlocks\foo.cpp -o obj\Debug\foo.o
C:\Users\peeru\TestCodeBlocks\foo.cpp: In function 'int someFunction()':
C:\Users\peeru\TestCodeBlocks\foo.cpp:6:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
C:\Users\peeru\TestCodeBlocks\foo.cpp: In member function 'int foo::someMethod()':
C:\Users\peeru\TestCodeBlocks\foo.cpp:11:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
g++.exe -Wall -std=c++98 -g -std=c++11 -I..\..\..\mingw64\include -c C:\Users\peeru\TestCodeBlocks\main.cpp -o obj\Debug\main.o
C:\Users\peeru\TestCodeBlocks\main.cpp: In static member function 'static void bar::somebar()':
C:\Users\peeru\TestCodeBlocks\main.cpp:14:21: error: 'someFunction' was not declared in this scope
        someFunction();
                     ^
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 2 warning(s) (0 minute(s), 0 second(s))

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

正如编译器所说,someFunction尚未在main.cpp中声明,仅在单独的翻译单元foo.cpp中声明。函数需要在使用前声明。

main.cpp中添加声明,或在两者中包含标题:

int someFunction();

正如其他警告所说,您还需要从声称返回int的函数中返回一些内容。

答案 1 :(得分:1)

您必须在main.cpp中为该函数提供声明,相应地修改foo.h标题:

#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED

#include <iostream>

int someFunction();

struct foo
{
    int someMethod();
};


#endif // FOO_H_INCLUDED

并在#include "foo.h"中添加main.cpp

我不确定为什么MSVC ++在没有抱怨的情况下进行编译。

答案 2 :(得分:0)

方法someFunction和所有其他方法都声明为返回类型int。因此,在函数末尾添加return 0或将它们声明为void。并且你不能从静态函数调用非静态函数。

答案 3 :(得分:0)

你在foo.cpp中声明了someFunction(),但是在main.cpp中没有。当main.cpp正在编译时,它不知道someFunction()的声明,所以它失败了。

你需要:

  1. int someFunction();添加到main.cpp

  2. 的顶部
  3. int someFunction();添加到foo.h文件,然后将#include "foo.h"添加到main.cpp