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.总述, ...
随机推荐
- appium操作微信公众号H5 web页面
安卓微信公众号的H5页面是webview,一般操作需要切换context. 在执行如下步骤,就能直接像识别native样识别webview 1.代码追加: ChromeOptions options ...
- mysql-5.7 密码过期详解
一.起源: 今天一上班就听到说error-log里记录了大量的 ERROR 1820 (HY000): You must reset your password using ALTER USER st ...
- svnserve配置文件详析
svnserve是SVN自带的一个轻型服务器,客户端通过使用以svn://或svn+ssh://为前缀的URL来访问svnserve服务 器,实现远程访问SVN版本库. svnserve可以通过配置文 ...
- [na]思科产品选型pdf
以前做工程时候想起了设备选型时候用过的一份文档. 有个小伙伴今天问起思科设备选型,恰好google到了这份文档 https://www.cisco.com/web/CN/products/pdf/04 ...
- 【Android】3.16 离线地图功能
分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 百度地图目前已经支持矢量离线地图数据的下载.更新. 使用离线地图,可满足在无网络环境下查看地图信息的 ...
- 怎么查看eclipse是否支持maven
打开eclipse,选择Windows->Preferences 查看Preferences下是否有Maven即可
- spark-streaming问题集锦
报错: // :: ERROR Utils: Exception encountered py4j.Py4JException: Cannot obtain a new communication c ...
- js实现点击按钮实现上一张下一张相册滚动效果
/****判断图片是否构成滚动效果*/$(function(){ if($("#bar").find('img').size()*71<=$("#bar&qu ...
- JSP 中的 Request 和 Response 对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的实例:response对象包含了响应客户请求的有关信息,但在JSP中 ...
- perl学习笔记(一)
关于Perl: Perl是一种高级.通用.直译式.动态的程序语言.最初设计者拉里·沃尔(Larry Wall)为了让在UNIX上进行报表处理的工作变得更方便,决定开发一个通用的脚本语言,而在1987年 ...