c++ friend 遇到 namespace 无法访问 private 成员的问题
相关的文章(比较有意思,记录一下):http://www.cnblogs.com/lx20030303/archive/2012/09/21/2696258.html
先看例子。如下。
尝试编译的话,错误提示:
Entrance.cpp
src\Entrance.cpp(15) : error C2248: “lqr::Entrance::id”: 无法访问 private 成员
(在“lqr::Entrance”类中声明)
C:\Users\Administrator\Desktop\tmp\include\Entrance.h(11) : 参见“lqr::E
ntrance::id”的声明
C:\Users\Administrator\Desktop\tmp\include\Entrance.h(9) : 参见“lqr::En
trance”的声明
src\Entrance.cpp(15) : error C2248: “lqr::Entrance::number”: 无法访问 private
成员(在“lqr::Entrance”类中声明)
C:\Users\Administrator\Desktop\tmp\include\Entrance.h(10) : 参见“lqr::E
ntrance::number”的声明
C:\Users\Administrator\Desktop\tmp\include\Entrance.h(9) : 参见“lqr::En
trance”的声明
NMAKE : fatal error U1077: “"D:\Program Files (x86)\Microsoft Visual Studio 12.
0\VC\BIN\cl.EXE"”: 返回代码“0x2”
Stop.
解决办法:把Entrance.cpp的第13行改为ostream& lqr::operator<<(ostream& os, const Entrance& e)
Entrance.h
#ifndef ENTRANCE_H
#define ENTRANCE_H #include <iostream> namespace lqr { class Entrance
{
unsigned int number;
int id;
public:
Entrance(unsigned int number, int id);
friend std::ostream& operator<<(std::ostream& os, const Entrance& e);
}; } #endif // ENTRANCE_H
Entrance.cpp
#include "Entrance.h"
#include <iostream> using namespace lqr;
using namespace std; Entrance::Entrance(unsigned int number_val, int id_val)
:number(number_val), id(id_val)
{
// do nothing
} ostream& operator<<(ostream& os, const Entrance& e)
{
return os << "Entrance #"<< e.id << ": "<< e.number;
}
main.cpp
#include "Entrance.h" #include <iostream> using namespace std;
using namespace lqr; int main()
{
Entrance en(, ); cout << en << endl; return ;
}
Makefile
# compiler
CC = cl
# linker
LINK = link
# libraries # headers
HEADER_PATH = /I include
# options
EHSC = /EHsc
COMPILATION_ONLY = /c
C_OUT = /Fo:
L_OUT = /OUT:
# compiler & linker debug option, to disable debug, replace '/Zi' & '/DEBUG' with empty strings
C_DEBUG = /Zi
L_DEBUG = /DEBUG
# C_DEBUG =
# L_DEBUG =
# targets
bin\test.exe: bin obj obj\main.obj obj\Entrance.obj
$(LINK) $(L_DEBUG) $(L_OUT)bin\test.exe obj\main.obj obj\Entrance.obj obj\main.obj: src\main.cpp include\Entrance.h
$(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\main.cpp $(C_OUT)obj\main.obj obj\Entrance.obj: src\Entrance.cpp include\Entrance.h
$(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\Entrance.cpp $(C_OUT)obj\Entrance.obj # folders obj:
mkdir obj bin:
mkdir bin # clean
# bin, obj folders and pdb files .PHONY: clean
clean:
-rmdir /s /q bin
-rmdir /s /q obj
-del *.pdb
c++ friend 遇到 namespace 无法访问 private 成员的问题的更多相关文章
- “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明)
c++工程编译报错: “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明) 错误无法直接定位源码位置,网上搜索了,也和我的代码不一样. 最后还是 ...
- VC++ error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
在使用诸如:CArray或是 CList等类时,经常会出现此错误 此错误的原因是由于自定义的类的数组项时 有一个操作如 Add() 在这个操作中,实际上需要一个 = 操作,但是这个 =操作在 自定 ...
- 错误 88 error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明) c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxcoll.h 590
最近接收了以前新公司遗留的代码,一个函数动不动就少的一千行,多的几千行,真是受不了这编码风格! 于是便使用了VS自带的重构工具,选择代码后右键-重构-提取方法,提取完方法就编译不过,想了好久原因,原来 ...
- 【转】C++类中对同类对象private成员访问
私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了 ...
- C#为何不推荐在构造函数中访问虚成员
如果在一个类中定义了虚属性或者虚方法,又在构造函数中访问了这个虚属性或方法,此时VisualStudio是不会给出警告,并且编译也没有问题,但是如果安装了Resharper插件则会给出警告提示:&qu ...
- C#中访问私有成员
首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...
- super关键字访问父类成员
1.super只能出现在子类的方法和构造方法中: 2.super调用构造方法时只能是第一句: 3.super不能访问父类的private成员.
- 匿名内部类访问方法成员变量需要加final的原因及证明(转)
https://blog.csdn.net/wjw521wjw521/article/details/77333820 在java编程中,没用的类定义太多对系统来说也是一个负担,这时候我们可以通过定义 ...
- C#中访问私有成员--反射
首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...
随机推荐
- CDK上安装kube-dashboard
首先把addon的代码下载下来 git clone https://github.com/minishift/minishift-addons 然后进入相应的目录,运行 ericdeMacBook-P ...
- Selenium IDE 基础使用教程
Selenium IDE 基础使用教程 简介及安装 Selenium IDE 是一个易于使用的Firefox插件.它提供了一个图形用户界面,可进行脚本录制及导出.其记录的脚本可以被转换成多种编程语言( ...
- javascript 检测浏览器类型和版本的代码
方法1:对象/特征检测法 该方法是一种判断浏览器能力(而非浏览器的确切型号)的通用方法.大部分JS专家认为这个方法最合适,因为他们认为按照该方法所编写的脚本是经得起未来考验的. //获取IE浏览器的版 ...
- 某公司java面试经历
为什么说某公司.由于确实面完了最后挂了回来也没记住公司叫啥名字.是老乡兼好友内推去的小公司,名字有点长,所以也没记住. 公司确实太小,所说是外包公司.然后面回来后跟ACM的前学长说了,他们仅仅说所以不 ...
- 【云计算】CloudFoundry参考资料
开源PaaS平台 Cloud Foundry:http://www.oschina.net/p/cloud+foundry/ 详解CloudFoundry中各个组件的作用:http://www.cst ...
- Sqlite-Sqlite3中的数据类型
大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的.刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列. Sqlite使用一个 ...
- json字符串跟objective-c模型的相互转换
在当今这样一个各种openapi开放的年代,在熟悉的语言下面找到一款得心应手的将json字符串转换成模型的库可以说是十分必要的,在NET平台下,我们有Newtonsoft.Json这个库使用,那么在i ...
- scala类型系统 type关键字
和c里的type有点像. scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型. type相当于声明一个类型别名: scala> t ...
- ajax请求接口数据
var api = 'http://192.168.68.208:666/ajax/api.ashx'; // api += 'action=/api/blackhistory/list&ke ...
- ssl证书之certbot
一.安装 1.下载压缩包:#wget https://github.com/certbot/certbot/archive/master.zip 2.解压包 3.官方文档https://github. ...