将包含模板的标头包含在源文件中导致错误

时间:2015-04-29 10:13:55

标签: c++ templates

我有以下类,其中包括在标题内创建的模板方法:

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;
    }
};

我有另一个继承自Network类的类DACN,并在其构造函数中使用模板方法:

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)

为什么我会收到此错误?

1 个答案:

答案 0 :(得分:0)

我发现了问题。我正在编译NVCC,因为我也在编译cuda代码。显然,NVCC在处理复杂的模板模式时遇到了问题。我现在重新安排了一些事情,使得NVCC在代码的模板证明部分调用GCC编译器。

抱歉占用你的时间。