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

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

我发现了问题。我正在使用 NVCC 进行编译,因为我也在编译 cuda 代码。显然 NVCC 在处理复杂的模板模式方面存在问题。我现在重新安排了一些事情,以便 NVCC 在代码的模板实体部分调用 GCC 编译器。

很抱歉占用您的时间。

【讨论】:

以上是关于将带有模板的标头包含到导致错误的源文件中的主要内容,如果未能解决你的问题,请参考以下文章

将带有 MIME 标头的文件保存到文件

cpp 文件#include 导致错误,@class 不是

带有 css/js 的 Django“包含”模板

带有 Qt/boost 项目的 VC xtree 内部标头中的语法错误

带有 jQ​​uery 的 Django 模板“包含”标签

在 Xcode 项目中使用 OpenCV 会导致链接器错误