如何在专业化版本中调用通用模板函数

时间:2011-07-13 06:15:35

标签: c++

有关如何在专业化版本中调用通用模板版本的问题。

以下是示例代码。但是“vector :: push_back(a)”以递归方式调用自身。

#include <iostream>
#include <vector>

using namespace std;

namespace std
{
        template<>
        void vector<int>::push_back(const int &a)
        {
                cout << "in push_back: " << a << endl;
                vector::push_back(a);               // Want to call generic version
        }
}

int main()
{
        vector<int> v;
        v.push_back(10);
        v.push_back(1);
        return 0;
}

3 个答案:

答案 0 :(得分:7)

当您为某个模板创建专门化(没有差异类函数)时,您告诉编译器生成那个而不是一般。所以事实上,如果你有专业化,那么你没有专门化的通用版本而你也无法调用它,因为它不存在

答案 1 :(得分:1)

您可以简单地将代码提取到另一个模板函数中:

    template<typename T>
    void baseF(T t) { ... }

    template<typename T>
    void F(T t) { baseF<T>(t); }

    template<>
    void F<int>(int t) { baseF<int>(t); }

答案 2 :(得分:0)

嗯,为了补充,我认为它适用于某些情况下的模板函数规范。

#include <iostream>
#include <vector>

using namespace std;

class Base
{
public:
    virtual int test() {return 0;}
};

class Derived : public Base
{
public:
    virtual int test() {return 1;}
};

template<class T>
void TestOutput(T* a)
{
    cout << a->test() << endl;
}

template<>
void TestOutput(Derived* a)
{
    cout << "something else" << endl;
    TestOutput<Base>(a);
}

int main()
{
    Derived d;
    TestOutput(&d);
}

我用visual studio 2013编译它,输出是:

  别的东西   1

虽然我不认为你总能找到Base的TestOutput函数来调用泛型函数。