请参阅以下代码
Specialized function in non specialized Template class
对于非专业模板类MyClass [行号7],是否可以编写专用函数foo?如果是,那么,同样的语法是什么
问候,
阿图尔
答案 0 :(得分:2)
请看下面的示例,我尝试用最简单的代码回答您的问题(如果我猜对了):
#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”的类的机会。 (需要对此进行确认)。
更新 ::在第2点确认。
答案 1 :(得分:2)
如果您创建类模板的完全特化,则可以执行此操作。请参阅此问题中的答案:If I want to specialise just one method in a template, how do I do it?
否则,如果您希望具有相同签名的给定函数具有两种不同的行为,具体取决于类的实例化版本,并且该实例化是模板类的部分特化,您将必须对模板类进行单独的专门化。
请记住,如果您想在第二种情况下避免冗余代码,您始终可以创建一个基本模板类,该类具有不会更改的功能,然后创建将包含必要的唯一功能的派生模板类对于每个部分专业化。
答案 2 :(得分:1)
如果你想专门化MyClass&lt; bool&gt; :: Foo,它看起来像这样:
template <>
void MyClass<bool>::Foo(bool A)
{
// code goes here
}
答案 3 :(得分:1)
如果你这么想,
(1)你想要一个不带任何参数的函数Foo()
在void
MyClass
(2)当Foo()
时,MyClass
应该是bool
独有的
模板类型为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
...
}
然后就是这样:
{{1}}