c++11,类里面有变参模板,怎么样将声明和定义分开

C++语言 码拜 5年前 (2016-06-10) 726次浏览
代码如下:
class A {
public:
A () { }
virtual ~A () { }
template <typename… Args>
void Do(Args&& … args) {
return;
}
protected:
private:
};
Do函数必须定义在h文件,假如h文件只申明,将定义放cpp文件的话链接不过,怎么样解决?
解决方案

5

没法解决,c++ 模板不支持分离编译。

5

由于樥板实现需要调用者对其参数类型绑定,因此,假如将实现放在cpp中,编译器在对cpp编译时,无法确定其类型以及变量所占空间

5

不能分开,模板的话必须这么做
不过,假如题主想要分开,有一个变种的方法
吧声明放在h文件
然后定义放在另一个自定义后缀名的文件
声明的后面加个include 吧存有定义的文件include进来
实际上这么做没必要,你直接写一块就行了,必须这么写是原因是在进行 模板实体化的时候必须要有这个模板的全部信息

10

引用:

由于樥板实现需要调用者对其参数类型绑定,因此,假如将实现放在cpp中,编译器在对cpp编译时,无法确定其类型以及变量所占空间

这不是原因,c++ 不支持模板分离编译完全是个设计决策,技术上是能够实现的,而且有人做出来了,只不过难度很高,属于成本大于利益的鸡肋特性,所以后来有取消了。

10

建一个
A.hpp

template <typename... Args>
void A::Do(Args&& ... args) {
             return;
}

A.h

#ifndef __A_H__
#define __A_H__
class A {
public:
A () { }
virtual ~A () { }
template <typename... Args>
void Do(Args&& ... args);
protected:
private:
};
#include "A.hpp"
#endif

5

目前c++11 都不支持。不过可以用模板特化技术实现:
例如:知道一个对象,不知道类型,需要再生成一个这个类型的对象。
在MyNew.h里声明,在MyTest.cpp实现。(g++ vs编译器都支持,原因是这是标准语法)。
main.cpp

#include "MyTest.h"
int main()
{
	MyTest f;
	MyNew(&f);
	getchar();
    return 0;
}

MyTest.cpp

#include "MyTest.h"
#include "MyNew.h"
template<> MyTest* MyNew<MyTest>(MyTest* f)
{
	return f->MyNew();
}

MyTest.h

#pragma once
#include "MyNew.h"
class MyTest
{
public:
	MyTest *MyNew()
	{
		std::cout << "MyTest New" << std::endl;
		return new MyTest();
	}
};

MyNew.h

#pragma once
#include <iostream>
template<typename T> T *MyNew(T*)
{
	return nullptr;
}
class MyTest;
template<> MyTest* MyNew<MyTest>(MyTest* f);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c++11,类里面有变参模板,怎么样将声明和定义分开
喜欢 (0)
[1034331897@qq.com]
分享 (0)