我在爲模板編寫C++時遇到3個問題。看來VS2013可以編譯下面的代碼。C++中的一些基本模板問題
代碼在這裏:
//template_test.h
#include <iostream>
using namespace std;
template<class T>
class mytest
{
public:
void method(T input);
void common();
};
template <>
class mytest<char>
{
public:
void method(char input);
void common();
};
template<class T>
void mytest<T>::method(T input)
{
cout << input << endl;
}
template<class T>
void mytest<T>::common()
{
cout << "common" << endl;
}
//template_test.cpp
#include "template_test.h"
void mytest<char>::method(char input)
{
cout << "char:" << input << endl;
}
void mytest<char>::common()
{
cout << "common" << endl;
}
//main.cpp
#include "template_test.h"
using namespace std;
int main()
{
mytest<char> test_char;
test_char.method('1');
test_char.common();
mytest<int> test_int;
test_int.method(1);
test_int.common();
system("pause");
return 0;
}
1.In執行mytest ::方法
template<class T>
void mytest<T>::method(T input)
{
cout << input << endl;
}
我可以刪除第二個T表示短的表達嗎?我在VS2013中嘗試下面的代碼而不是原始的cpp,並且無法編譯。
template<class T>
void mytest::method(T input)
{
cout << input << endl;
}
這似乎很奇怪,我需要使用它如此複雜的形式與這麼多的模板參數。
2.In h文件,我delclare類 'mytest的' 使用模板專門與
template <>
class mytest<char>
{
public:
void method(char input);
void common();
};
和各功能的實現是
//template_test.cpp
#include "template_test.h"
void mytest<char>::method(char input)
{
cout << "char:" << input << endl;
}
void mytest<char>::common()
{
cout << "common" << endl;
}
我的問題是,當我將.h文件中的實現放在.cpp文件以外的非專業化模板類的實現中時,VS2013也會報告錯誤或代碼。
我知道非專業化模板類的聲明和實現應該在同一個頭文件中,因爲C++不應該允許在其他文件中顯示非專業化模板類。但爲什麼專業模板類的聲明和實現應該在不同的代碼文件中?
3.In頭文件
template<class T>
class mytest
{
public:
void method(T input);
void common();
};
template <>
class mytest<char>
{
public:
void method(char input);
void common();
};
很明顯,功能「公共」是專業化和非專業化模板類的公共部分。然而,專業化將專業化整個班級。我只想保留常用功能,所以不需要在專業化版本中編寫相同的功能。我不知道如何得到它。
我是C++模板編程領域的新手,上面的3個問題基本和簡單。我在谷歌搜索一些問題,但仍然不知道。所以我在這裏發佈我的問題。
*「但是,爲什麼聲明和實現專業化模板類的應該在不同的代碼文件?「*顯式(完全)專用類模板的成員函數是*簡單函數*,也就是說,ODR適用於其他任何成員函數:程序中必須只有一個定義,如果它們不是'inline'。 – dyp