关于错误:非静态成员引用必须与特定对象相对

 1 #include<string>
 2 #include<iostream>
 3 using namespace std;
 4 class TextBlock
 5 {
 6 public:
 7     TextBlock():text("hello") {}
 8     const char& operator[](size_t position) const{ return text[position]; }
 9     char& operator[](size_t position){ return text[position]; }
10 
11     /* static */ void print(const TextBlock& tb){ cout << tb[0]; }
12 private:
13      string text;
14 };
15 
16 int main()
17 {
18     TextBlock B;
19 
20     TextBlock::print(B);
21     /* B.print(B); */
22     system("pause");
23 }

在VS2013里输入以上代码会报错:非静态成员引用必须与特定对象相对。

类的成员有两种:静态成员和实例成员(包括实例和函数)。实例成员的存储空间属于具体的实例,不同实例(对象)的同名成员拥有不同的存储空间;静态成员的存储空间是固定的,与具体的实例(对象)无关,被该类的所有实例共享。

访问静态成员可以用ClassName::MemberName,也可以用ClassName.MemberNme,但最好用前者,因为很容易就可以判定成员是静态成员。

访问实例成员只能用ClassName.MemberName,不能用ClassName::MemberName.

本例中就是因为用ClassName::MemberName访问实例变量出错。

所以解决方法是:将以上类的成员函数print声明为static。或者函数调用时用ClassName.MemberName的方式。

详情:http://blog.csdn.net/shenqi67/article/details/7533094

原文地址:https://www.cnblogs.com/ll-10/p/5371055.html