我正在尋找一個損失函式,它可以將 2 個任意維度的張量作為引數,但張量 1 (t1) 和張量 (t2) 的維度必須匹配。下面是我試圖用來將張量傳遞給函式的模板。我在想 T 將是一種型別,而 N 將模擬可能的索引數量,而無需明確為無限可能的張量維度撰寫型別。
損失.h
#include <iostream>
namespace Loss {
template<class T, std::size_t N>
void loss(Eigen::Tensor<T, N, 0>& predicted, Eigen::Tensor<T, N, 0>& actual) {
std::cout << "Loss::loss() not implemented" << std::endl;
};
};
主程式
#include "loss.h"
int main() {
Eigen::Tensor<double, 3> t1(2, 3, 4);
Eigen::Tensor<double, 3> t2(2, 3, 4);
t1.setZero();
t2.setZero();
Loss::loss(t1, t2);
return 0;
}
從我的編輯器編譯之前我得到的型別錯誤:
沒有函式模板“Loss::loss”的實體與引數串列匹配——引數型別是: (Eigen::Tensor<double, 3, 0, Eigen::DenseIndex>, Eigen::Tensor<double, 3, 0,特征::密集索引>
這是我編譯后得到的訊息(不成功):
注意:候選模板被忽略:替換失敗 [with T = double]:推匯出的非型別模板引數與相應模板引數的型別不同('int' vs 'std::size_t'(又名 'unsigned long') ) void loss(Eigen::Tensor<T, N, 0>&predicted, Eigen::Tensor<T, N, 0>& actual) { ^ 1 錯誤產生。
uj5u.com熱心網友回復:
錯誤資訊指出非型別模板引數的型別是size_t,但在宣告中t1,t2該引數的值是 3,它有型別int。這種不匹配使模板引數推導失敗。
您可以通過將非型別模板引數的型別更改為 int
template<class T, int N>
void loss( // ...
或者就讓它被推匯出來
template<class T, auto N>
void loss( // ...
uj5u.com熱心網友回復:
數字文字是有符號整數,并且您已將模板的數字型別指定size_t為無符號。所以型別不匹配。嘗試Eigen::Tensor<double, 3u> …在您的主程式中使用無符號文字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340731.html
上一篇:開發工具:第六章:Java開發者相關的所有軟體安裝包(35.55GB的資源)
下一篇:用一個回圈列出兩個骰子的排列
