以类为参数调用模板类的静态模板方法

Posted

技术标签:

【中文标题】以类为参数调用模板类的静态模板方法【英文标题】:call static template method of template class with class as parameter 【发布时间】:2017-06-11 10:52:55 【问题描述】:

static 具有 (i) 模板和 (ii) 类本身作为参数的模板类的方法没有任何问题,是吗?考虑类

template<class Projection>
struct FrameData 
    // ...
    template <bool devPtr>
    static void allocate(FrameData<Projection> &data) 
        // ... do allocations ...
    


这是在文件A 的标题中声明的。在世界其他地方,我有类似的东西

template <class Projection>
void some_method(FrameData<Projection> &m_data) 
    FrameData<Projection>::allocate<true>(m_data);

我终于有了一些

error: reference to overloaded function could not be resolved; did you mean to call it?
对于static 方法like the answer here 是否有某种类似的.template 魔法? 参数FrameData&lt;Projection&gt;有问题吗?还没有完全定义?

这个世界的其他地方在技术上是在一个源文件中,在底部进行了一些显式的实例化,但我把这些都放在一个文件中,但错误相同。感谢您提供任何见解,请不要在非标题模板上羞辱我。这不是我的选择。

【问题讨论】:

这样的 API 对我来说似乎是倒退的,至少在名称的选择上是这样。您不能“分配”通过引用传递的对象,它必须已经存在,即已分配。 是的,我缩短了名称并删除了大部分定义。它是一个封装结构,包含指向主机/设备数据的指针 这很好,除了已经回答的::template 细节。也许真正的来源有充分的理由,但不清楚为什么你在 static 函数中采用相同类型的参数而不是使用隐式参数:template &lt;bool devPtr&gt; void allocate(); 哦,我明白你们俩的意思了。我不认为我有这样做的理由。我认为它变成了这样,因为它最初是从C 翻译的,所以你的标准make_struct 类型的东西可能刚刚被扔进了课堂。不过我完全同意,我必须改变它(现在我实际上能够编译它xD) 【参考方案1】:

对于像这里的答案这样的静态方法,是否有某种类似的 .template 魔法?

是的。

template <class Projection>
void some_method(FrameData<Projection> &m_data) 
    FrameData<Projection>::template allocate<true>(m_data);

【讨论】:

AhHhHHHhhhh 哇,我不敢相信我从未尝试过。谢谢,一过 12 分钟窗口就会接受。

以上是关于以类为参数调用模板类的静态模板方法的主要内容,如果未能解决你的问题,请参考以下文章

派生类型的自动静态调用

实验2:函数重载函数模板简单类的定义和实现

限制指针类型模板参数和覆盖模板基类的虚拟方法

DLL-导出模板基类的静态成员

模板……基础知识笔记

具有模板函数名称的可变参数模板