因此标题有点误导。但它正是我想要做的。我创建了一个小案例场景。这种情况适用于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))
有什么建议吗?
答案 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()的声明,所以它失败了。
你需要:
将int someFunction();
添加到main.cpp
将int someFunction();
添加到foo.h文件,然后将#include "foo.h"
添加到main.cpp