Receive error: undefined reference to static member while I have defined them in classname.cpp
Receive error: undefined reference to static member while I have defined them in classname.cpp
我试图在 class 中定义静态成员,但总是收到对静态成员未定义引用的错误。
我发现已经有很多类似的问题了。但似乎在这些问题中出现了错误,因为它们没有在 class 之外的某个地方定义静态成员。我确定我已经定义了这些静态成员。
以下是我的代码中有问题的部分。
在foo.h中,我定义了一个class名字为foo.
#include <random>
#include <vector>
class foo
{
public:
int random = dist(mt);
static std::random_device rd;
static std::mt19937 mt;
static std::uniform_int_distribution<int> dist;
static std::vector<int> ans(const int &);
};
在foo.cpp中有静态成员的定义
#include<random>
#include<vector>
#include "foo.h"
std::random_device foo::rd;
std::uniform_int_distribution<int> foo::dist(0, 10);
std::mt19937 foo::mt(rd());
std::vector<int> foo::ans(const int & size) {
std::vector<int> bb;
for(int i=0; i < size; ++i)
bb.push_back(dist(mt));
return bb;
}
我在另一个名为 test.cpp
的 cpp 文件中使用了 class
#include <random>
#include <vector>
#include <iostream>
#include "foo.h"
int main()
{
foo a;
std::vector<int> c=a.ans(5);
for(auto it=c.begin(); it!=c.end(); ++it)
std::cout<<*it<<"\t";
std::cout<<"\n";
}
使用 g++ test.cpp -o a.out
,我总是收到:
/tmp/ccUPnAxJ.o: In function `main':
test.cpp:(.text+0x37): undefined reference to `foo::ans(int const&)'
/tmp/ccUPnAxJ.o: In function `foo::foo()':
test.cpp:(.text._ZN3fooC2Ev[_ZN3fooC5Ev]+0xd): undefined reference to `foo::mt'
test.cpp:(.text._ZN3fooC2Ev[_ZN3fooC5Ev]+0x12): undefined reference to `foo::dist'
collect2: error: ld returned 1 exit status'
我的g++版本是:g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2,g++
是g++ -std=c++11
的别名。
你需要:
g++ test.cpp foo.cpp -o a.out
否则,g++
怎么会知道 foo.cpp
?它不会根据 #include "foo.h"
.
神奇地猜测
我试图在 class 中定义静态成员,但总是收到对静态成员未定义引用的错误。
我发现已经有很多类似的问题了。但似乎在这些问题中出现了错误,因为它们没有在 class 之外的某个地方定义静态成员。我确定我已经定义了这些静态成员。
以下是我的代码中有问题的部分。
在foo.h中,我定义了一个class名字为foo.
#include <random>
#include <vector>
class foo
{
public:
int random = dist(mt);
static std::random_device rd;
static std::mt19937 mt;
static std::uniform_int_distribution<int> dist;
static std::vector<int> ans(const int &);
};
在foo.cpp中有静态成员的定义
#include<random>
#include<vector>
#include "foo.h"
std::random_device foo::rd;
std::uniform_int_distribution<int> foo::dist(0, 10);
std::mt19937 foo::mt(rd());
std::vector<int> foo::ans(const int & size) {
std::vector<int> bb;
for(int i=0; i < size; ++i)
bb.push_back(dist(mt));
return bb;
}
我在另一个名为 test.cpp
的 cpp 文件中使用了 class#include <random>
#include <vector>
#include <iostream>
#include "foo.h"
int main()
{
foo a;
std::vector<int> c=a.ans(5);
for(auto it=c.begin(); it!=c.end(); ++it)
std::cout<<*it<<"\t";
std::cout<<"\n";
}
使用 g++ test.cpp -o a.out
,我总是收到:
/tmp/ccUPnAxJ.o: In function `main':
test.cpp:(.text+0x37): undefined reference to `foo::ans(int const&)'
/tmp/ccUPnAxJ.o: In function `foo::foo()':
test.cpp:(.text._ZN3fooC2Ev[_ZN3fooC5Ev]+0xd): undefined reference to `foo::mt'
test.cpp:(.text._ZN3fooC2Ev[_ZN3fooC5Ev]+0x12): undefined reference to `foo::dist'
collect2: error: ld returned 1 exit status'
我的g++版本是:g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2,g++
是g++ -std=c++11
的别名。
你需要:
g++ test.cpp foo.cpp -o a.out
否则,g++
怎么会知道 foo.cpp
?它不会根据 #include "foo.h"
.