C++; 在用模板编码C++时,我遇到了3个问题。VS2013似乎可以编译下面的代码
代码如下: //模板测试C++; 在用模板编码C++时,我遇到了3个问题。VS2013似乎可以编译下面的代码,c++,templates,C++,Templates,代码如下: //模板测试 #包括 使用名称空间std; 模板 类mytest { 公众: 无效法(T输入); 无效公共(); }; 模板 类mytest { 公众: void方法(字符输入); 无效公共(); }; 模板 void mytest::方法(T输入) { 库特 是否可以从模板void mytest::method(T输入)中省略 不需要。虽然在简单的情况下它似乎是多余的,但在更复杂的情况下,例如,当存在多个局部专门化时,它就变得很有必要。保持语法一致也很有帮助 当将完全专用类模板的成
#包括
使用名称空间std;
模板
类mytest
{
公众:
无效法(T输入);
无效公共();
};
模板
类mytest
{
公众:
void方法(字符输入);
无效公共();
};
模板
void mytest::方法(T输入)
{
库特
是否可以从模板void mytest::method(T输入)
中省略
不需要。虽然在简单的情况下它似乎是多余的,但在更复杂的情况下,例如,当存在多个局部专门化时,它就变得很有必要。保持语法一致也很有帮助
当将完全专用类模板的成员函数的定义放入头中时,会出现“the”错误(我假设您得到了多个声明的符号)
完全专用类模板的成员函数被视为非类模板的成员函数:只有一个版本,编译器永远不需要隐式实例化它。因此,函数不是隐式内联的,就像任何函数模板一样,可能需要在如果要将定义放入头中,则需要显式地将其声明为inline
如何在类模板及其专用化之间共享函数
除了语法之外,类模板及其任何专门化都没有共同之处。它们是完全独立的类。有两种方法可以在不同的专门化之间共享公共功能:
将公共功能放入公共基类中并在其中实现逻辑。如果功能需要访问实际模板的成员,则可以使用授予基类对专用化的访问权限
不要将公共功能设置为成员函数,而是将其设置为接受任何专门化的函数模板
根据您的通用功能需要做什么,一种或另一种方法工作得更好
Dietmar Kühl对1的回答的一点补充。感受不同:
- 非专业类模板方法的实现
模板类mytest
:
template <class T>
void mytest<T>::method(T input)
{
// ...
// use of input
}
模板
void mytest::方法(T输入)
{
// ...
//输入的使用
}
- 对于指向对象的指针,部分类模板专门化方法的实现
模板类mytest
:
template <class T>
void mytest<T*>::method(T* input)
{
// ...
// use of *input
}
模板
void mytest::方法(T*输入)
{
// ...
//*输入的使用
}
- 针对指向另一类数据成员的指针,实现部分类模板专用化
模板类mytest
:
template <class U, class V>
void mytest<U V::*>::method(V& object, U V::* input)
{
// ...
// use of object.*input
}
模板
void mytest::方法(V&object,U V::*输入)
{
// ...
//对象的使用。*输入
}
- 全类模板专门化方法的实现
模板类mytest
:
template <class T>
void mytest<T>::method(T input)
{
// ...
// use of input
}
void mytest::方法(字符输入)
{
// ...
//输入的使用
}
- 非专用类模板的完全专用方法的实现
模板类mytest
:
template <class T>
void mytest<T>::method(T input)
{
// ...
// use of input
}
模板
void mytest::方法(int输入)
{
// ...
//输入的使用
}
“但是为什么专门化模板类的声明和实现应该在不同的代码文件中?”显式(完全)专门化类模板的成员函数只是函数,也就是说,ODR对它们的应用与对任何其他(成员)的应用一样函数:如果不是内联的,程序中必须只有一个定义。如果要显式地专门化类模板的某些成员函数,有第三种方法,例如template struct mytest{void common(){/*…*/}void special(){/*…*/};template void mytest::special(){/*…*/};template void mytest::special(){/*…*/}
template <class T>
void mytest<T>::method(T input)
{
// ...
// use of input
}
template <class T>
void mytest<T*>::method(T* input)
{
// ...
// use of *input
}
template <class U, class V>
void mytest<U V::*>::method(V& object, U V::* input)
{
// ...
// use of object.*input
}
void mytest<char>::method(char input)
{
// ...
// use of input
}
template <>
void mytest<int>::method(int input)
{
// ...
// use of input
}