代码如下:
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);