1

我想专门化一个类模板的构造函数。这不起作用:

template<typename T>
struct One {};

template<typename T>
struct Two {};

template<template<typename> class T, template<typename> class U>
struct Three : public T<Three<T, U>>, public U<Three<T, U>> {};

template<typename T> struct Four;

template<typename T>
struct Four
{
   Four();
};

template<template<typename> class T, template<typename> class U>
Four<Three<T, U>>::Four() {}

int main(int argc, char *argv[])
{
   Four<Three<One, Two> > obj;
}

但是将类模板定义更改为此有效:

template<typename T> struct Four;

template<template<typename> class T, template<typename> class U>
struct Four<Three<T, U>>
{
   Four();
};

template<template<typename> class T, template<typename> class U>
Four<Three<T, U>>::Four() {}

这似乎我正在专门研究整个类模板。但是,我只想专门化上面代码中的构造函数——那个不起作用。为什么我不能专门化Fourfor just的构造函数Three(我没有更改类模板的 ctor 的签名)?

4

1 回答 1

0

你不能。你必须专攻整个班级。但是..您可以使用继承作为解决方法:

#include <iostream>

class something {};

template <typename T> class hidden_base {
    public:    hidden_base() {a = 1;}
    protected: int a;
};

template<> class hidden_base<something> {
    public:    hidden_base() {a = 2;}
    protected: int a;
};

template <typename T>
class your_class : public hidden_base<T> {
public:
    void lots();
    void of();
    void other();
    void member();
    void functions();
    void here();

    void show_a() {std::cout << hidden_base<T>::a << std::endl;}
};

int main() {
    your_class<long>().show_a();
    your_class<int>().show_a();
    your_class<something>().show_a();
}

这将打印:

1
1
2
于 2013-10-23T16:39:44.397 回答