-
问题简述
error LNK2001: 无法解析的外部符号 “private: static int ETH::m_age” (?m_age@ETH@@0HA)
这类问题是我们在编译过程很常见,原因我百度的时候发现也分好几种,有可能是没有包含相应的头文件,也有可能是没有包含库文件,不过还有一种原因比较刁钻,一般不轻易看得出来,就是在头文件中某个类里定义了一个静态成员变量,然后未在源文件对这个变量进行显示初始化。我本次遇到的情况就是这样的。 -
看码说话
VirlualMoney.h
#pragma once
#include <iostream>
class ETH
:public VirlualMoney
{
public:
ETH(){ std::cout << "I am ETH!" << std::endl; }
~ETH(){}
static void SetETHAge(const int age)
{
m_age = age;
}
private:
static int m_age; //定义一个静态成员变量
};
main.cpp
#include <iostream>
#include "VirlualMoney.h"
int main(int argc, char* argv[])
{
ETH ethDemo;
ethDemo.SetETHAge(20);
return 0;
}
此时编译会报错,因为静态成员变量需要显示初始化才能使用,我们需要修改一下main.cpp
#include <iostream>
#include "VirlualMoney.h"
int ETH::m_age = 0; //静态成员变量需要在源文件中显示初始化,在头文件中显示初始化会报错
int main(int argc, char* argv[])
{
ETH ethDemo;
ethDemo.SetETHAge(20);
return 0;
}
ok,编译通过!