我在以下模板類專業化foo.h:
using VisionMethod = enum
{
TemplateMatching,
...
};
template <VisionMethod>
class Foo
{
Foo() = delete;
};
template <>
class Foo<TemplateMatching>
{
public:
static void get_pose();
};
并希望將其實施foo.cpp為:
#include "foo.h"
void
Foo<TemplateMatching>::get_pose()
{
std::cout << "Using foo<TemplateMatching>::get_pose()...\n";
}
但我(有些可以理解),當我嘗試呼叫得到一個連接錯誤foo<TemplateMatching>::get_pose()在如main.cpp后僅包括foo.h。我可以實作我想要的,而不必包含foo.cpp在其中之一foo.h或main.cpp- 也許使用顯式實體化?或者像foo.txx我唯一的“干凈”解決方案?
uj5u.com熱心網友回復:
您提出的建議已經有效(在 add 之后#include <iostream>),您可能忘記告訴編譯器包含foo.cpp.
喜歡 g main.cpp foo.cpp
https://wandbox.org/permlink/LDpxhgeYPkakWFwE
uj5u.com熱心網友回復:
您需要定義您的專用功能(即您放入的內容foo.cpp)foo.h以便在main.cpp
據我所知,沒有人可以逃避這條規則。但是如果你想把你的頭檔案和實作分開以使你的專案更清晰,一個非常常見的解決方案是將實作放在一個單獨的檔案中(我通常給它擴展名 .inl)并將它包含在檔案的末尾頭檔案。這樣,從人類的角度來看,它看起來像是頭檔案/實作分離,但編譯器仍然可以在其頭檔案中包含所有內容。此檔案不是編譯目標,因此您不必為其指定 .cpp 擴展名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/366257.html
