使用msvc 2013在Windows上构建qt 5.7时编译错误

时间:2016-09-28 18:39:29

标签: c++ qt templates c++11

当我尝试构建Qt 5.7的源代码时,我收到以下编译错误

  

qnode_p.h(108):错误C2955:   ' Qt3DCore :: QNodePrivate :: DestructionFunction' :使用别名模板   需要模板参数列表

     

qnode_p.h(105):见声明   ' Qt3DCore :: QNodePrivate :: DestructionFunction' qscene.cpp

     

qnode_p.h(108):错误C2955:' Qt3DCore :: QNodePrivate :: DestructionFun   ction' :使用别名模板需要模板参数列表

     

qnode_p.h(105):见声明   ' Qt3DCore :: QNodePrivate :: DestructionFunction'生成代码

错误C2955使用别名模板需要模板参数列表。

导致问题的源代码在

之下
class QT3DCORE_PRIVATE_EXPORT QNodePrivate : public QObjectPrivate, public    QObservableInterface
{
    public:
   QNodePrivate();
   ~QNodePrivate();
...
   template<typename Caller, typename NodeType>
   using DestructionFunction = void (Caller::*)(NodeType *);

   template<typename Caller, typename NodeType, typename PropertyType>
   void registerDestructionHelper(NodeType *, DestructionFunction<Caller, NodeType>, PropertyType);

   template<typename Caller, typename NodeType>
   void registerDestructionHelper(NodeType *node, DestructionFunction<Caller, NodeType> func, NodeType *&)
   {
      // If the node is destoyed, we make sure not to keep a dangling pointer to it
      auto f = std::bind(func, static_cast<Caller *>(q_func()), nullptr);
      m_destructionConnections.insert(node, QObject::connect(node, &QNode::nodeDestroyed, f));
   }

   template<typename Caller, typename NodeType>
   void registerDestructionHelper(NodeType *node, DestructionFunction<Caller, NodeType> func, QVector<NodeType*> &)
   {
      // If the node is destoyed, we make sure not to keep a dangling pointer to it
      auto f = std::bind(func, static_cast<Caller *>(q_func()), node);
      m_destructionConnections.insert(node, QObject::connect(node, &QNode::nodeDestroyed, f));
   }

   //....
}

第105行正在使用

DestructionFunction = void (Caller::*)(NodeType *);

第108行

void registerDestructionHelper(NodeType *, DestructionFunction<Caller, NodeType>, PropertyType);

从我读到的关于C ++ 11的内容来看,这应该编译好了,但由于某些原因vs 2013会出现上述错误。

1 个答案:

答案 0 :(得分:0)

如果有人帮忙的话:

评论第104和105行:

// template<typename Caller, typename NodeType>
// using DestructionFunction = void (Caller::*)(NodeType *);

更改第108行:

void registerDestructionHelper(NodeType *, DestructionFunction, PropertyType);

为:

void registerDestructionHelper(NodeType *, void (Caller::*)(NodeType *), PropertyType);

第111行:

void registerDestructionHelper(NodeType *node, DestructionFunction<Caller, NodeType> func, NodeType *&)

到:

void registerDestructionHelper(NodeType *node, void (Caller::*func)(NodeType *), NodeType *&)

第119行来自:

void registerDestructionHelper(NodeType *node, DestructionFunction<Caller, NodeType> func, QVector<NodeType*> &)

到:

void registerDestructionHelper(NodeType *node, void (Caller::*func)(NodeType *), QVector<NodeType*> &)