C++/CLI中class成员声明与实现分开在不同文件时必须添加namespace
以下是我的代码:
- //TaskConfigFile.h
- #pragma once
- using namespace System::Collections::Generic;
- using namespace System;
- using namespace System::IO;
- using namespace System::Text;
- ref class TaskConfigFile
- {
- public:
- TaskConfigFile();
- TaskConfigFile(String^ str_link, Int64 file_size, short threads_sum);
- TaskConfigFile(String^ str_link, Int64 file_size);
- String^ link;//下载链接
- String^ fileName;//文件名
- String^ filePath;//文件存储路径
- Int64 fileSize;//文件总大小
- Int64 blockSize;//文件分块大小
- Int64 sumDownloadedSize;//已下载的总大小
- short threadsSum;//线程总数,默认为5
- //以字典记录各分块已下载的大小,key为分块的起始位置(字节),value为此分块已下载的大小
- Dictionary<Int64, Int64>^ blockDownloadedSize;
- #ifdef DEBUG
- Debug::Listeners->Add( gcnew TextWriterTraceListener( Console::Out ) );
- Debug::AutoFlush = true;
- #endif
- bool Save();//保存配置信息
- bool Load(String^ path);//加载配置信息
- };
- //TaskConfigFile.cpp
- #include "stdafx.h"
- #include "TaskConfigFile.h"
- TaskConfigFile::TaskConfigFile():
- link(nullptr), fileName(nullptr), fileSize(0L), filePath(nullptr), blockSize(0L), sumDownloadedSize(0L), threadsSum()
- {
- blockDownloadedSize = gcnew Dictionary<Int64, Int64>(threadsSum);
- }
- TaskConfigFile::TaskConfigFile(String^ str_link, Int64 file_size, short threads_sum):
- link(str_link), fileSize(file_size), threadsSum(threads_sum), sumDownloadedSize()
- {
- blockDownloadedSize = gcnew Dictionary<Int64, Int64>(threadsSum);
- }
- TaskConfigFile::TaskConfigFile(String^ str_link, Int64 file_size):
- link(str_link), fileSize(file_size), threadsSum(), sumDownloadedSize()
- {
- blockDownloadedSize = gcnew Dictionary<Int64, Int64>(threadsSum);
- }
- bool TaskConfigFile::Save()
- {
- String^ path = String::Concat(filePath, fileName, ".tmp");
- Stream^ writeStream = gcnew FileStream(path, FileMode::Create, FileAccess::Write);
- if(writeStream == nullptr)
- {
- #ifdef DEBUG
- Diagnostics::Debug::WriteLine("文件路径错误!");
- #endif
- return false;
- }
- BinaryWriter^ binaryWriter = gcnew BinaryWriter(writeStream, Encoding::ASCII);
- binaryWriter->Write(this->link);
- binaryWriter->Write(this->fileName);
- binaryWriter->Write(this->filePath);
- binaryWriter->Write(this->fileSize);
- binaryWriter->Write(this->blockSize);
- binaryWriter->Write(this->sumDownloadedSize);
- binaryWriter->Write(this->threadsSum);
- for each(KeyValuePair<Int64, Int64> pair in blockDownloadedSize)
- {
- binaryWriter->Write(pair.Key);
- binaryWriter->Write(pair.Value);
- }
- writeStream->Close();
- binaryWriter->Close();
- return true;
- }
- bool TaskConfigFile::Load(String^ path)
- {
- Stream^ readStream = gcnew FileStream(path, FileMode::Open, FileAccess::Read);
- if(readStream == nullptr)
- {
- #ifdef DEBUG
- Diagnostics::Debug::Indent();
- Diagnostics::Debug::WriteLine("error: 打开文件失败!");
- Diagnostics::Debug::WriteLine("Paht: {0}", path);
- Diagnostics::Debug::UnIndent();
- #endif
- return false;
- }
- BinaryReader^ binaryReader = gcnew BinaryReader(readStream);
- try
- {
- link = binaryReader->ReadString();
- fileName = binaryReader->ReadString();
- filePath = binaryReader->ReadString();
- fileSize = binaryReader->ReadInt64();
- blockSize = binaryReader->ReadInt64();
- sumDownloadedSize = binaryReader->ReadInt64();
- threadsSum = binaryReader->ReadInt16();
- for(int i = ; i < threadsSum; ++i)
- {
- Int64 key = binaryReader->ReadInt64();
- Int64 value = binaryReader->ReadInt64();
- blockDownloadedSize->Add(key, value);
- }
- }
- catch(EndOfStreamException^ ex)
- {
- #ifdef DEBUG
- Diagnostics::Debug::Indent();
- Diagnostics::Debug::WriteLine("The end of the stream is reached.");
- Diagnostics::Debug::WriteLine(ex->Message);
- Diagnostics::Debug::Unindent();
- #endif
- readStream->Close();
- binaryReader->Close();
- return true;
- }
- return true;
- }
我将他们放在同一个文件就能编译通过。一旦分开就会出现链接错误:
这是因为.NET以程序集作为编译单元,每一个程序集里类的成员声明与定义必须在同一个namespace下,而这两个文件中并没有声明namespace,所以链接器找不到TaskConfigFile Class成员的实现代码。
必须将它们声明在同一个namspace中:
- //TaskConfigFile.h
- namespace xxx
- {
- //..............
- }
- //TaskConfigFile.cpp
- using namespace xxx;
C++/CLI中class成员声明与实现分开在不同文件时必须添加namespace的更多相关文章
- C#中解决Response.AddHeader("Content-Disposition", "attachment; filename=" + filename)下载文件时文件名乱码的问题
问题:下载文件时文件名乱码怎么解决? 在C#写后台代码过程中,经常遇到下载文件出现文件名乱码的问题,在网上找了很多方法,总是存在浏览器不兼容的问题,当IE浏览器不乱码时,火狐浏览器就会乱码,后来经过反 ...
- 新建Class文件时,添加作者版权注释声明
以安装路径C盘为例,各版本路径如下: VS2015:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTempla ...
- C++/CLI中的const literal initonly 友元(转)
C++/CLI中的const literal initonly 友元 C++/CLI中的const Visual C++并不允许在const对象上调用成员函数,除非该成员函数也被声明为const. C ...
- Java接口中的成员变量为什么必须声明为public static final?
我想对于每个Java程序员来说,接口都不陌生,接口中的方法也经常使用.而接口中的成员变量,就显得用得少一点,而对于成员变量为什么必须声明为public static final,可能就更不清楚了,而且 ...
- YTU 2618: B 求类中数据成员的最大值-类模板
2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec 内存限制: 128 MB 提交: 430 解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...
- java多态中哪些成员具备多态特性
在多态的学习中,当子类继承父类时,子类中的变量哪些具备多态特性,哪些不具备多特特性. 代码: class Father{ public static int x=10; public int y=11 ...
- Java中的成员初始化顺序和内存分配过程
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
- 接口中的成员变量必须是static
首先要弄清接口的含义. 接口就是提供一种统一的'协议’, 而接口中的属性也属于'协议’中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 在interface里面的变量都是public st ...
- 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式
本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...
随机推荐
- jenkins 发送邮件失败
jenkins 配置发送邮件,发送测试邮件,邮件发送失败: Failed to send out e-mail javax.mail.MessagingException: Could not con ...
- keras在win7下环境搭建
无gpu安装过程:一.卸载之前版本. 把之前单独安装的Python等统统卸载掉.学python的时候直接安装了python2.7,先把他卸载掉,因为Anaconda里边包含了python.二.安装A ...
- unity 设置屏幕尺寸
在PlayerSettings中将web player的screen size设成600x900后,需要在Game视图下拉菜单中选Web(600x900),Game视图才能显示成我们设定的尺寸.
- Python之反射练习
# 什么是反射?可以用字符串的方式去访问对象的属性 class Test(): _name = "sss" def fun(self): return "Hellowor ...
- ASP.NET 解决URL中文乱码的解决
暂时先记录一个方法: 在Web.config文件中configuration下的system.web下加入一个配置项:globalization,主要是设置其requestEncoding,貌似中文系 ...
- 《Android源代码设计模式解析与实战》读书笔记(二十)
第二十章.适配器模式 适配器模式是结构型设计模式之中的一个,它在我们的开发中使用率极高,比方ListView.GridView以及RecyclerView都须要使用Adapter. 1.定义 适配器模 ...
- Windows下打造Sublime Text + Tex Live环境
一直在用Sublime Text + ctex集成环境编写Latex文档,最近发现ctex套件内嵌的MiKTeX包管理器功能太弱了,遂将目标转向了功能更加强大的Tex Live环境. 首先安装Tex ...
- ubuntu 清理系统垃圾与备份
虽然linux下不会有windows下的那么多垃圾和磁盘碎片!但还是会留下一些用不着的临时文件或是多次升级后的N个旧的内核! 1,非常有用的清理命令:sudo apt-get autocleansud ...
- iOS-ARC_Xcode检测循环引用
iOS-ARC_Xcode检测循环引用 一,在桌面上新建立一个工程,在ViewController.m中输入如下代码: - (void)viewDidLoad { [super viewDidLoad ...
- 20个可能你不知道Linux网路工具
如果要在你的系统上监控网络,那么使用命令行工具是非常实用的,并且对于 Linux 用户来说,有着许许多多现成的工具可以使用,如: nethogs, ntopng, nload, iftop, iptr ...