代码如下:
class A {
public:
A () { }
virtual ~A () { }
template <typename… Args>
void Do(Args&& … args) {
return;
}
protected:
private:
};
Do函数必须定义在h文件,假如h文件只申明,将定义放cpp文件的话链接不过,怎么样解决?
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进来
实际上这么做没必要,你直接写一块就行了,必须这么写是原因是在进行 模板实体化的时候必须要有这个模板的全部信息
不过,假如题主想要分开,有一个变种的方法
吧声明放在h文件
然后定义放在另一个自定义后缀名的文件
声明的后面加个include 吧存有定义的文件include进来
实际上这么做没必要,你直接写一块就行了,必须这么写是原因是在进行 模板实体化的时候必须要有这个模板的全部信息
10
这不是原因,c++ 不支持模板分离编译完全是个设计决策,技术上是能够实现的,而且有人做出来了,只不过难度很高,属于成本大于利益的鸡肋特性,所以后来有取消了。
10
建一个
A.hpp
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
例如:知道一个对象,不知道类型,需要再生成一个这个类型的对象。
在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);