[英]Can't deduce template parameter
我有下面的類結構,它試圖生成一個編譯時生成的樹層次結構
struct NodeBase{
virtual constexpr uint32_t size() const = 0;
virtual constexpr bool empty() const = 0;
constexpr NodeBase(){};
};
template <size_t L>
class Node : NodeBase{
private:
const uint32_t * const ptr;
const std::array<const NodeBase &, L> nodes;
public:
constexp Node(std::initializer_list<NodeBase> const ts, uint32_t const * const ptr) :
NodeBase(),
ptr(ptr),
nodes{ts}
{
};
constexpr uint32_t size() const {
return nodes.size();
}
constexpr bool empty() const {
return (ptr==nullptr) ? true : false;
}
}
// helper function should allow for template deduction
template<size_t T>
constexpr Node<T> makeNode(std::initializer_list<NodeBase> const ts, uint32_t const * const ptr){
return Node<T>(ts, ptr);
};
template <size_t L>
class Item : Node{
public:
constexpr Item() :
Node<L>({member}, nullptr)
{
};
private :
// here lies the problem
template <size_t M>
static constexpr Node<M> member = makeNode({},nullptr);
}
但是,這會導致編譯器(gcc 4.9.1)錯誤:沒有對makeNode(,null_ptr_t)的匹配函數調用,並且有一條注釋說明無法推斷出模板類型。
我可以通過將參數M移到類級別模板中來解決錯誤,但這會帶來一些非常可怕的后果,因為參數列表將在樹層次結構的每個級別上增長。 我確定編譯器應該能夠推斷出類型,該類型取決於提供給構造函數的初始化程序列表的長度。 有什么想法嗎?
如果函數參數中沒有使用模板類型,編譯器應如何推斷模板類型? 可能是你想要的
static constexpr Node<M> member = makeNode<M>({},nullptr);
根據您的評論,我認為這是您可能想要的。 我放棄了使用std::initializer_list
。 在C ++ 14中,它應該有一個constexpr
成員來返回元素的數量,但是我無法使它起作用,並且無論如何您都標記了問題C ++ 11。 相反,我使用的是普通的老式C數組,其大小可以通過模板機制來推導。
template <size_t M>
struct Node {};
template <size_t M>
constexpr Node<M> makeNode(int const (&list)[M])
{
return Node<M>();
}
class Item
{
static constexpr auto member = makeNode({1, 2, 3});
};
請注意,在類范圍內使用auto
僅適用於靜態成員,但您似乎滿足了這一要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.