以下是我的代码:

//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的更多相关文章

  1. C#中解决Response.AddHeader("Content-Disposition", "attachment; filename=" + filename)下载文件时文件名乱码的问题

    问题:下载文件时文件名乱码怎么解决? 在C#写后台代码过程中,经常遇到下载文件出现文件名乱码的问题,在网上找了很多方法,总是存在浏览器不兼容的问题,当IE浏览器不乱码时,火狐浏览器就会乱码,后来经过反 ...

  2. 新建Class文件时,添加作者版权注释声明

    以安装路径C盘为例,各版本路径如下: VS2015:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTempla ...

  3. C++/CLI中的const literal initonly 友元(转)

    C++/CLI中的const literal initonly 友元 C++/CLI中的const Visual C++并不允许在const对象上调用成员函数,除非该成员函数也被声明为const. C ...

  4. Java接口中的成员变量为什么必须声明为public static final?

    我想对于每个Java程序员来说,接口都不陌生,接口中的方法也经常使用.而接口中的成员变量,就显得用得少一点,而对于成员变量为什么必须声明为public static final,可能就更不清楚了,而且 ...

  5. YTU 2618: B 求类中数据成员的最大值-类模板

    2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec  内存限制: 128 MB 提交: 430  解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...

  6. java多态中哪些成员具备多态特性

    在多态的学习中,当子类继承父类时,子类中的变量哪些具备多态特性,哪些不具备多特特性. 代码: class Father{ public static int x=10; public int y=11 ...

  7. Java中的成员初始化顺序和内存分配过程

    Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...

  8. 接口中的成员变量必须是static

    首先要弄清接口的含义. 接口就是提供一种统一的'协议’, 而接口中的属性也属于'协议’中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 在interface里面的变量都是public st ...

  9. 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

    本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...

随机推荐

  1. docker基本概念2

    1 docker 容器,容器可以被创建.启动.停止.删除.暂停等 容器是镜像的一个运行实例,不同的是,他有额外的可写文件层.提供了独立的应用环境. 容器的实质是进程,与宿主机进程不同的是有自己的独立的 ...

  2. 定时登录下载sftp服务器上的某些有规则的文件

    [root@1-live duizhangdan]# cat wget.sh #!/bin/bash#定时下载sina sftp服务器上的bak_dir=`date -d"5 day ago ...

  3. tag标签数据库的设计

    方案一: 一个表,里面有个tags字段,存放以空格或逗号分隔的标签.缺点是长度受限,tag个数受限,查询like ‘%abc%’效率低 方案二: 同方案一,支持全文索引,或者用Lucence索引查询 ...

  4. Java:HttpClient篇,HttpClient4.2在Java中的几则应用:Get、Post参数、Session(会话)保持、Proxy(代理服务器)设置,多线程设置...

    新版HttpClient4.2与之前的3.x版本有了很大变化,建议从http://hc.apache.org/处以得到最新的信息. 关于HttpCore与HttpClient:HttpCore是位于H ...

  5. 有关VS中单元测试的一些问题

    需要config的测试 测试中如果调用的类库需要使用config文件读取配置,可以通过在测试项目中建立App.config,并添加相应字段即可.

  6. [k8s]容器化node-expolore(9100)+cadvisor(8080)+prometheus(9090) metric搜集,grafana展示

    Prometheus 的核心,多维数据模型 传统监控工具统计数据方式 指标多 - 需求1,统计app1-3,的(总)内存,则定义3个指标 container.memory_usage_bytes.we ...

  7. UIActivityIndicatorView的详细使用

    转自:http://www.cnblogs.com/top5/archive/2012/05/17/2506623.html UIActivityIndicatorView实例提供轻型视图,这些视图显 ...

  8. 程序挂在dynamic_cast<CCObject*>(pDelegate)->retain();

    CCTargetedTouchDelegate 的继承 和 dynamic_cast 想写个可以响应touch的sprite 类定义成了这个样子: class GemBoard : public CC ...

  9. 每日英语:Why Food Companies Are Fascinated by the Way We Eat

    Are you a cruncher? Or a 'smoosher'? cruncher:咬嚼者,咬碎 Some people crave the perfectly crispy crunch o ...

  10. 如何創建一個自己的 Composer/Packagist 包 (PHP)

    如何創建一個自己的 Composer/Packagist 包 首先讓我們踏着歡快的腳步去Github創建一個新庫,這裏取名 composer-car,又歡快的將它克隆到本地: git clone ht ...