将带有模板的标头包含到导致错误的源文件中
Posted
技术标签:
【中文标题】将带有模板的标头包含到导致错误的源文件中【英文标题】:Including a header with template into a source file causing an error 【发布时间】:2015-04-29 10:13:54 【问题描述】:我有以下类,其中包括在标头内创建的模板方法:
Network.h
class Network
Network(cudnnHandle_t handle, std::vector<int> batch);
template <typename T, typename... Args, typename std::enable_if<std::is_same<Block, T>::value>::type* = nullptr> T create(Args&&... args)
Block block(handle_, batch_, std::forward<Args>(args)...);
blocks_.push_back(block);
return block;
;
我有另一个类 DACN,它继承自 Network 类并在其构造函数中使用模板方法:
DACN.h
class DACN : public Network
public:
DACN(cudnnHandle_t handle, std::vector<int> batch, int temporal_stride, int action_dim) : Network(handle,batch)
auto s = create<Block>(temporal_stride,84,84);
;
此时一切编译正常,没有错误。但是,只要我构建 DACN.cpp 文件并包含 DACN.h 文件:
DACN.cpp
#include "DACN.h"
编译 DACN.cpp 文件时出现以下错误:
DACN.h(13):错误:没有重载函数“DACN::create”的实例 匹配参数列表的参数类型有:(int, int, int)
为什么会出现这个错误?
【问题讨论】:
你的Block
构造函数的签名是什么?
Block 构造函数签名是:Block(cudnnHandle_t handle, std::vectortemplate <typename T, typename... Args> typename std::enable_if<std::is_same<Block, T>::value, T>::type create(Args&&... args)
,看看是否是编译器问题
@Fiorentino 你在DACN
类中也有create
函数
【参考方案1】:
我发现了问题。我正在使用 NVCC 进行编译,因为我也在编译 cuda 代码。显然 NVCC 在处理复杂的模板模式方面存在问题。我现在重新安排了一些事情,以便 NVCC 在代码的模板实体部分调用 GCC 编译器。
很抱歉占用您的时间。
【讨论】:
以上是关于将带有模板的标头包含到导致错误的源文件中的主要内容,如果未能解决你的问题,请参考以下文章