簡體   English   中英

無法推斷模板參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM