我正在阅读模板完整指南,它说:这里讨论的是类模板专门化。虽然可以专门化类模板的单个成员函数,但一旦这样做,就不能再专门化专门化成员所属的整个类模板示例。我实际上想知道这是怎么回事,因为你可以在没有任何成员函数的情况下进行专门化。这是不是说你不能有一个只有一个成员函数的特化,然后另一个有所有成员函数?有人能澄清一下吗?
44u64gxh1#
我想是指以下的情况:
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
nx7onnlm2#
我认为这意味着你可以:
neekobn83#
Explicit and implicit instantiation和类似以下的情况可以被记住。当类被显式示例化时,泛型类的所有成员都将出现在示例化的类中。然而,假设通过提及类主体来描述类专门化。只有在专门化类中显式定义的成员(无论是已经存在于泛型类中的成员还是新成员)才会出现在示例化类中。假设(泛型类的)成员函数经由特定作用域的类专门化来定义,则专门化的类被隐式地示例化,其将以适当专门化的方式具有这些函数以及泛型类中存在的所有其他成员。在第二种情况下,由于一个专门化的类已经被隐式地示例化了,我们以后不能再定义一个具有相同专门化的类,无论是通过显式示例化还是通过提到类体。为了添加特定于该专门化的成员,可能需要执行后者。在这种情况下,这是不可能的,因为编译器已经示例化了一个专用类。不管类专门化可以被示例化的这些方式如何,用户总是可以自由地基于其他模板参数来示例化其他专门化。
3条答案
按热度按时间44u64gxh1#
我想是指以下的情况:
一旦这样做了,您就不能将完整的模板专门化为任何其他东西,所以
nx7onnlm2#
我认为这意味着你可以:
neekobn83#
Explicit and implicit instantiation和类似以下的情况可以被记住。
当类被显式示例化时,泛型类的所有成员都将出现在示例化的类中。然而,假设通过提及类主体来描述类专门化。只有在专门化类中显式定义的成员(无论是已经存在于泛型类中的成员还是新成员)才会出现在示例化类中。
假设(泛型类的)成员函数经由特定作用域的类专门化来定义,则专门化的类被隐式地示例化,其将以适当专门化的方式具有这些函数以及泛型类中存在的所有其他成员。
在第二种情况下,由于一个专门化的类已经被隐式地示例化了,我们以后不能再定义一个具有相同专门化的类,无论是通过显式示例化还是通过提到类体。为了添加特定于该专门化的成员,可能需要执行后者。在这种情况下,这是不可能的,因为编译器已经示例化了一个专用类。
不管类专门化可以被示例化的这些方式如何,用户总是可以自由地基于其他模板参数来示例化其他专门化。