ลองมาตัวอย่างหนึ่งสมมติว่าด้วยเหตุผลบางอย่างที่คุณต้องการมีคลาสเทมเพลต:
//test_template.h:
#pragma once
#include <cstdio>
template <class T>
class DemoT
{
public:
void test()
{
printf("ok\n");
}
};
template <>
void DemoT<int>::test()
{
printf("int test (int)\n");
}
template <>
void DemoT<bool>::test()
{
printf("int test (bool)\n");
}
ถ้าคุณคอมไพล์รหัสนี้ด้วย Visual Studio - มันทำงานนอกกรอบ gcc จะสร้างข้อผิดพลาด linker (หากไฟล์ส่วนหัวเดียวกันถูกใช้จากไฟล์. cpp หลายไฟล์):
error : multiple definition of `DemoT<int>::test()'; your.o: .../test_template.h:16: first defined here
เป็นไปได้ที่จะย้ายการใช้งานไปยังไฟล์. cpp แต่คุณต้องประกาศคลาสเช่นนี้ -
//test_template.h:
#pragma once
#include <cstdio>
template <class T>
class DemoT
{
public:
void test()
{
printf("ok\n");
}
};
template <>
void DemoT<int>::test();
template <>
void DemoT<bool>::test();
// Instantiate parametrized template classes, implementation resides on .cpp side.
template class DemoT<bool>;
template class DemoT<int>;
แล้ว. cpp จะมีลักษณะเช่นนี้:
//test_template.cpp:
#include "test_template.h"
template <>
void DemoT<int>::test()
{
printf("int test (int)\n");
}
template <>
void DemoT<bool>::test()
{
printf("int test (bool)\n");
}
หากไม่มีสองบรรทัดสุดท้ายในไฟล์ส่วนหัว - gcc จะทำงานได้ดี แต่ Visual Studio จะสร้างข้อผิดพลาด:
error LNK2019: unresolved external symbol "public: void __cdecl DemoT<int>::test(void)" (?test@?$DemoT@H@@QEAAXXZ) referenced in function
ไวยากรณ์คลาสเทมเพลตเป็นตัวเลือกในกรณีที่คุณต้องการแสดงฟังก์ชั่นผ่านการส่งออก dll แต่สิ่งนี้ใช้ได้เฉพาะกับแพลตฟอร์ม windows เท่านั้นดังนั้น test_template.h อาจมีลักษณะเช่นนี้:
//test_template.h:
#pragma once
#include <cstdio>
template <class T>
class DemoT
{
public:
void test()
{
printf("ok\n");
}
};
#ifdef _WIN32
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
template <>
void DLL_EXPORT DemoT<int>::test();
template <>
void DLL_EXPORT DemoT<bool>::test();
ด้วยไฟล์. cpp จากตัวอย่างก่อนหน้า
อย่างไรก็ตามสิ่งนี้จะทำให้ปวดหัวกับ linker ได้มากกว่าดังนั้นจึงแนะนำให้ใช้ตัวอย่างก่อนหน้าถ้าคุณไม่ส่งออกฟังก์ชัน. dll