【发布时间】: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::vector
n, int c, int h, int w, float val = 0.0);但是,为什么 Block 构造函数签名很重要?如果我不将 DACN.h 包含到 DACN.cpp 文件中,一切都会编译。 -
@Fiorentino 你用的是什么编译器?您的文件看起来如何?您还有哪些其他错误消息?
-
@Fiorentino 尝试改用
template <typename T, typename... Args> typename std::enable_if<std::is_same<Block, T>::value, T>::type create(Args&&... args),看看是否是编译器问题 -
@Fiorentino 你在
DACN类中也有create函数