C ++解析的外部符号(C++ unresolved external symbol)

2019-07-21 10:21发布

位于C嗨IAM初学者++我有静态方法类,我不能访问它们它将引发我一个错误

    1>------ Build started: Project: CPractice, Configuration: Debug Win32 ------
1>  Source.cpp
1>Source.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > CPractice::name" (?name@CPractice@@0V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)
1>c:\users\innersoft\documents\visual studio 2012\Projects\CPractice\Debug\CPractice.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这里是我的代码

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string>

using namespace std;

class CPractice
{
    public:
        static void setName(string s)
        {
            name = s;
        }
        static string getName()
        {
            return name;
        }
    private:
        static string name;
};


int main()
{


    CPractice::setName("Name");
    cout << "\n" << CPractice::getName();
    system("PAUSE");
    return EXIT_SUCCESS;
}

Answer 1:

static string name;

因为它是static ,此行只是声明 name -你需要定义它。 只要把下面这个类定义:

string CPractice::name;

如果你最终你的类移动到相应的头文件和实现文件,请确保你把这个定义在实现文件。 它应该只在一个单一的翻译单位来定义。



Answer 2:

你只申报name中的类,静态变量需要像这样的外部类的定义:

string CPractice::name ="hello" ;


Answer 3:

因为名字是一个静态数据成员应该初始化:)和默认实例相关的构造不计。

在类的定义添加这个(是的,我知道它的混乱,因为你的会员是一个私人性质,但是这仅仅是一个初始化):

string CPractice::name;


Answer 4:

我想你想用编译gcc ,当你应该与编译g++ 。 见什么是G ++和gcc之间的区别? 更多关于这一点。

您还需要添加string CPractice::name; 下面类定义。



文章来源: C++ unresolved external symbol