[英]Call non-specialised template class function from specialized template class function
[英]Specialized function in non specialised Template class
看看我下面的例子,我尝试用最简单的代码回答你的问题(如果我猜对了):
#include <iostream>
using namespace std;
template<typename T>
class Some
{
public:
template<typename U> void foo(U val);
};
template<typename T>
template<typename U>
void Some<T>::foo(U val)
{
cout << "Non specialized" << endl;
}
template<>
template<>
void Some<char>::foo(char val)
{
cout << "Char specialized" << endl;
}
int main()
{
Some<int> t1;
t1.foo(5);
Some<char> t2;
t2.foo('c');
return 0;
}
这里要注意的重要一点是“你不能专门化你的类和独立运作”,即你必须在示例中同时专注于两者。
此外,在这种情况下,您将失去专门针对该数据类型“char”的类的机会。 (需要对此进行确认)。
UPDATE ::在第2点确认。
如果您创建类模板的完全特化,则可以执行此操作。 只需参考这个问题的答案: 如果我想在模板中专门使用一种方法,我该怎么做?
否则,如果您希望具有相同签名的给定函数具有两种不同的行为,具体取决于类的实例化版本,并且该实例化是模板类的部分特化,则必须对模板类进行单独的特化。
请记住,如果要在第二种情况下避免冗余代码,您始终可以创建一个基本模板类,该类具有不会更改的功能,然后创建包含每个部分所需的唯一功能的派生模板类专业化。
如果你想专门化MyClass <bool> :: Foo,它看起来像这样:
template <>
void MyClass<bool>::Foo(bool A)
{
// code goes here
}
如果你问这个,
(1)你想要一个函数Foo()
,它不接受任何参数并在MyClass
返回void
(2)当模板类型为bool
,此Foo()
应该是MyClass
独有的,即仅适用于MyClass<bool>
那么这就是方式:
template<class Precision>
class MyClass {
...
public:
...
void Foo (); // don't implement here
};
...
template<>
void MyClass<bool>::Foo () // implementing only for 'MyClass<bool>'
{ // invoking for other 'MyClass<>' will result in compiler error
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.