当前位置: 首页 > 知识库问答 >
问题:

忽略函数模板特化

於炯
2023-03-14

我写了一个模板函数,它使用了另外两个模板函数(添加

template <typename Dtype>
Dtype mulvadd(Dtype* pa, Dtype* pb, int size, Dtype c)
{
    Dtype result = Dtype(0);
    for (int k = 0; k < size; k++)
    {
        result = add<Dtype>(result, mul<Dtype>(pa[k],pb[k]));
    }
    result = add<Dtype>(result, c);
    return result;
}

int16_t mulv_int16(int16_t* pa, int16_t* pb, int size);

在math_functions.cpp中,我对add有不同的专门化

#include <stdint.h>
#include <fix16.h>
template<> float add<float>(float a, float b) { return a + b;}
template<> float mul<float>(float a, float b) { return a*b;}
template<> int16_t add<int16_t>(int16_t a, int16_t b) { return fix16_sadd(a, b); }
template<> int16_t mul<int16_t>(int16_t a, int16_t b) { return fix16_smul(a, b); }

#ifndef FIXMATH_NO_32BIT
template<> int16_t mulvadd<int16_t>(int16_t* pa, int16_t* pb, int size, int16_t c)
{
    return c + mulv_int16(pa, pb, size);
}
#endif

int16_t mulv_int16(int16_t* pa, int16_t* pb, int size)
{
   ....
}

我还编写了一个简单的测试程序:

#include "math_functions.h"
int main(int argc, char ** argv) {
    int16_t av[4] = {241,134};
    int16_t bv[4] = {-28, 7};
    int16_t res = mulvadd<int16_t>(av, bv, 2, 0);
    printf("res=%f\n", (double)res);
}

这段代码编译时没有任何错误,但奇怪的是,当我调用mulvadd时,调用的函数是h文件中定义的默认模板,而不是cpp文件中的专用版本。发生这种情况的原因是什么?

共有1个答案

周祺
2023-03-14

编译器在使用 main 函数编译文件时不会知道特化。它所知道的只是头文件中的内容。

在头文件中声明特化,以便编译器了解它们。

 类似资料:
  • 我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非

  • 我使用常规StackPanel(在DataTemplate中)堆叠了一些TextBlock元素。 将其用作ContentControl的ContentTemplate时,布局将按预期显示。但是,如果我将DataTemplate用作ListView的ItemTemplate,就会忽略一些属性(TextLineBounds和Margin)。 在下面的截图中,我放置了一个ContentControl和一

  • 是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错

  • 我试图在类型s. t上专门化一个类。它忽略了给定类型的恒定性。在这种情况下,该类型是一个模板模板参数: 上面的代码在GCC 4.8.4和clang 5.0(with-std=c 11)中都抱怨bar在与匹配FOFType模板参数化的类一起使用时未定义。即使我删除了sfinae参数,仍然无法找到特化。 这个问题的一个例子可以在这里找到:https://godbolt.org/g/Cjci9C.在上面

  • 如果我没有理解错的话,类模板定义了一个函数,所以当我调用时,编译器有可能进行隐式强制转换,但是在函数模板的情况下,此时没有函数定义,所以隐式强制转换不会发生。 但我不明白为什么编译器不能创建函数定义,然后应用隐式强制转换? 错误是: 在函数“int main()”中:    25:24:错误:调用“test2::add(void(&)(int))”没有匹配函数    25:24:注:候选人是:  

  • 问题内容: 如何使装饰器忽略有关缓存键的某些函数参数? 例如,我有一个看起来像这样的函数: 如果我像这样应用装饰器,它将包含在缓存键中。结果,如果我尝试使用相同但不同的函数调用该函数,它将再次执行,这是我想避免的。我只想考虑论点。 问题答案: 使用cachetools可以编写: