为什么我得到一个链接错误
Why do I get a linker error?
为什么我得到一个链接错误?
/*
test.cpp
© Andrey Bushman, 18 Jun 2013
*/
//--------------------------------------------
#include <exception>
#include <iostream>
using namespace std;
//--------------------------------------------
namespace Bushman{
//--------------------------------------------
class MyClass{
public:
MyClass();
};
//--------------------------------------------
MyClass::MyClass(){
void func(); // declaration
func(); // call
}
//--------------------------------------------
void func(){ // definition
cout << "Ping..." << endl;
}
}
//============================================
int main()
try{
namespace B = Bushman;
B::MyClass a;
}
catch(exception& e){
cerr << e.what() << endl;
return 1;
}
catch(...){
cerr << "Unknown exception." << endl;
return 2;
}
结果(由MS Visual Studio 2012编写):
C:bs13>cl test.cpp /EHsc
Microsoft (R) C/C++ Optimizing Compiler
Version 17.00.51106.1 for x64 Copyright (C) Microsoft Corporation. All
rights reserved.
test.cpp
Microsoft (R) Incremental Linker Version 11.00.51106.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.exe test.obj test.obj : error LNK2019: unresolved external
symbol "void __cdecl func(void)" ( ?func@@YAXXZ) referenced in
function "public: __cdecl Bushman::MyClass::MyClass( void)"
(??0MyClass@Bushman@@QEAA@XZ) test.exe : fatal error LNK1120: 1
unresolved externals
C:bs13>
谢谢。
看起来您的编译器错误地将名称引入全局命名空间,而不是c++ 11 3.5/7指定的最内层封闭命名空间(Bushman
):
如果没有发现带有链接的实体的块作用域声明引用其他声明,则该实体是最内层封闭命名空间的成员。
代码在GCC上按预期编译:http://ideone.com/PR4KVC
你应该能够通过在正确的命名空间中声明函数,而不是在构造函数的块作用域中声明它来解决这个bug。但是,我不能访问你的编译器来测试。
namespace Bushman{
MyClass::MyClass(){
void func(); // declaration
func(); // call
}
//--------------------------------------------
void func(){ // definition
cout << "Ping..." << endl;
}
}
在MyClass
构造函数中声明func()
。这个应该与您在Bushman
名称空间中定义的func()
相同;但似乎你的编译器弄错了。一般来说,在另一个函数或构造函数中声明一个函数被认为是不好的做法。相反,你应该直接在你想要的作用域中声明函数。在本例中,您需要在Bushman
名称空间内对func()
进行前向声明:
namespace Bushman{
void func(); // declaration
MyClass::MyClass(){
func(); // call
}
//--------------------------------------------
void func(){ // definition
cout << "Ping..." << endl;
}
}
或者,您可以将代码拆分为单独的.h和.cpp文件。事实上,这是理想的。我建议将func()
放在func.cpp
中,在func.h
中声明。同样地,将MyClass
声明放在myclass.h
中,将MyClass
定义放在myclass.cpp
中。现在myclass.cpp
应该包含" function .h"。
以这种方式使用头文件可以使您对前向声明进行微调控制,并确保在需要时定义所有内容。
你在声明一个函数
void func()
它正在遮蔽方法
void MyClass::func()
所以你的调用调用的是未定义的函数,而不是方法。
相关文章:
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- glutBitmapCharacter()给出一个链接错误c++
- 如何合并两个双重链接列表(访问下一个链接)
- 链接在与另一个链接的库中链接
- 如何将不同类型的节点存储在一个链接列表中
- 比较一个链接列表与另一个黑名单与词频列表C++
- 我可以创建一个链接另一个库但不依赖于其include的c++库吗
- 为什么当你不定义函数时,你会得到一个链接器错误而不是编译器?
- 另一个链接器错误
- 一个链接节点,在一个节点中有两个项目
- CMake:在静态库上设置一个链接器标志,供用户在链接时使用(Visual Studio)
- 为什么我得到一个链接错误
- 当尝试使用静态ifstream成员和附带的函数时,我得到一个链接器错误
- 为什么这会给我一个链接器错误?(使用随机数生成<random>)
- -I和-L和-L都是正确的,但我仍然得到一个链接错误
- 我收到一个链接器错误,我不理解 VC++ 和 FLTK
- 我的树节点缺少一个链接
- C++ 你好世界不会编译?似乎是一个链接问题...
- 从一个链接对象到另一个链接对象的访问
- 为什么我得到一个链接错误