我想創建兩個類(Eigen :: Vector3d和MyVector,協議緩衝區消息)的對象之間的轉換函數,但我想延遲函數體的評估,直到函數被引用(在這一點上兩個類將被定義)。如果函數從未使用過,可以在C++模板函數中使用未定義的類型嗎?
函數應該在稍後定義這兩個類的文件中可調用,並且如果函數從不使用,它不應該導致編譯錯誤。
我:
#include <Eigen/Core> // defines Eigen::Vector3d
class MyVector {
public: int set_x(int x) { x_ = x; }
private: int x_;
}
void operator<< (MyVector &msg, const Eigen::Vector3d &vec) {
msg.set_x(vec.x());
}
,我作爲使用:
MyVector msg;
Eigen::Vector3d vec(1, 2, 3);
msg << vec;
這工作正常,如果函數MyVector後確定,但我想能夠定義的函數,使得它可以包含在缺少MyVector類的翻譯單元中。
我可以在功能改成這樣:
template<typename Msg>
void operator<< (Msg &msg, ...
但是這是不可接受的,因爲它適用於其他消息類:
quaternion_msg << Eigen::Vector3d(1, 2, 3); // quaternion has xyz but also w!
,我想這導致生成錯誤。
有什麼樣的模板魔法可以做到這一點?如果沒有,有沒有更好的方法來爲這個操作符添加MyVector到頭文件(或者它的依賴)?
爲什麼不把操作符<<作爲MyVector的成員? – xis
「,但我希望能夠定義該函數,使其可以包含在缺少MyVector類的翻譯單元中。」您是否嘗試在MyVector類定義爲 – ali
的情況下使用void運算符<<(MyVector&msg,const Eigen :: Vector3d&vec),您可以爲MyVector類型創建模板特化,併爲通用模板存根創建一個代碼,編譯錯誤。 – goldcode