【问题标题】:template class member function only specialization模板类成员函数只特化
【发布时间】:2011-08-22 10:36:07
【问题描述】:

我正在阅读关于模板的完整指南,其中内容如下:

在哪里谈论类模板专业化。

虽然可以专门化一个成员函数 类模板,一旦你这样做了,你就不能再专精了 专门成员所属的整个类模板实例 到。

我实际上想知道这是怎么回事,因为您可以在没有任何成员函数的情况下进行专业化。是不是说你不能有一个只有一个成员函数的特化,然后另一个有所有成员函数的特化?

有人可以澄清一下吗?

【问题讨论】:

    标签: c++ templates specialization


    【解决方案1】:

    我认为是指以下情况:

    template <typename T>
    struct base {
       void foo() { std::cout << "generic" << std::endl; }
       void bar() { std::cout << "bar" << std::endl; }
    };
    template <>
    void base<int>::foo() // specialize only one member
    { 
       std::cout << "int" << std::endl; 
    }
    int main() {
       base<int> i;
       i.foo();         // int
       i.bar();         // bar
    }
    

    一旦完成,您就不能将完整的模板专门化为任何其他东西,所以

    template <>
    struct base<int> {};  // error
    

    【讨论】:

    • 您或许应该注意,如果您只是专门化成员并且使用上面的完整模板专门化,则 专门化 是仍然有效 - 依赖于 foobar 的调用代码不再存在。即,您在上面发布的相同代码,修改为不专门化成员并且不调用 foobar 可以正常工作 - 请参阅 ideone.com/3kHa3
    • 所以我猜这个成员专业化创建了一个实例,因此您不能再拥有另一个专业化?
    • @Tony - 对,但你当然可以为不同类型设置另一个专业化,例如base&lt;float&gt;
    【解决方案2】:

    我认为这意味着您可以:

    • 特化整个类和所有成员(数据和函数,静态与否,虚拟与否)必须声明和定义,即使它们与非特化版本相同,

    • 特化一些函数成员,但是你不能特化整个类(即所有成员的声明方式与非特化情况相同,你只需提供一些函数成员的实现)。

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多