高手們,我想給這個模板類做一個顯式具體化,但是報這個錯是怎么回事?哪里做錯了?百度上面模板類的顯式具體化全是一句帶過...沒用
struct Person {
std::string m_name;
short m_age;
};
//模板類,用來存盤兩個數及交換,正常情況下都是隱式實體化
template<typename T>
class Test {
private:
T m_a;
T m_b;
public:
Test(T a, T b);
void swap();
void show() const;
};
template<typename T>
Test<T>::Test(T a, T b):m_a(a),m_b(b) {
}
template<typename T>
void Test<T>::swap() {
T temp = m_a;
m_a = m_b;
m_b = temp;
}
template<typename T>
void Test<T>::show() const {
std::cout << "a:" << m_a << std::endl;
std::cout << "b:" << m_b << std::endl;
}
//顯示實體化類模板
template
class Test<int>;
//顯示具體化類模板來處理結構體
template<>
class Test<Person> {
private:
Person m_a;
Person m_b;
public:
Test(Person& a, Person& b);
void swap();
void show() const;
};
template<>
Test<Person>::Test(Person& a, Person& b) :m_a(a), m_b(b) {
}
template<>
void Test<Person>::swap() {
auto temp = m_a.m_age;
m_a.m_age = m_b.m_age;
m_b.m_age = temp;
}
template<>
void Test<Person>::show() const {
std::cout << "a:" << m_a.m_name << ' ' << m_a.m_age << std::endl;
std::cout << "b:" << m_b.m_name << ' ' << m_b.m_age << std::endl;
}
uj5u.com熱心網友回復:
我最近也是遇到這樣的問題,不過我看stl原始碼都是直接在類的內部就定義函式內容,就不會報錯,然后我也這樣做了.uj5u.com熱心網友回復:
我試了一下你說的辦法,確實也行.
還有就是把函式定義不加template<>,然后放在另外一個cpp里,也是可以的.
就是不知道為什么會報錯...
uj5u.com熱心網友回復:
洗掉template<>參考自MSDN(目測是VS做出的規定)
https://docs.microsoft.com/zh-cn/previous-versions/cx7k7hcf(v=vs.120)
uj5u.com熱心網友回復:
template<>Test<Person>::Test(Person& a, Person& b) :m_a(a), m_b(b) {
}
書上是這樣說的template<>為空,這將導致顯示具體化。作為模板用template<>,
外面定義直接Test<Person>::Test(Person& a, Person& b) :m_a(a), m_b(b) {
}就好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103083.html
標籤:C++ 語言
上一篇:一個懶漢模式單例crash的問題
