有关如何在专业化版本中调用通用模板版本的问题。
以下是示例代码。但是“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;
}
答案 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函数来调用泛型函数。