【问题标题】: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 函数

标签: c++ templates


【解决方案1】:

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

很抱歉占用您的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-19
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多