首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用这个使用可变模板变量的模板修复编译错误

如何使用这个使用可变模板变量的模板修复编译错误
EN

Stack Overflow用户
提问于 2018-09-19 03:34:05
回答 1查看 42关注 0票数 1

我正在学习使用可变模板编写代码,并编写了一个简单的可变模板来进行实验。编译器报告模板参数为1的m_bindingObj成员变量无效。我错过了什么?

代码语言:javascript
复制
#include <iostream>
#include <functional>

class ClassA
{
public:

   static ClassA * construct(int varA, int varB, int varC)
   {
      return new ClassA(varA, varB, varC);
   }


   ClassA(int varA, int varB, int varC)
      : m_varA(varA)
      , m_varB(varB)
      , m_varC(varC) {}

   static std::function<ClassA *(int, int, int)> getBinding() { return std::bind(&ClassA::construct, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); }

   int m_varA;
   int m_varB;
   int m_varC;
};


template <typename T>
class ToolFactory
{
public:

   template <typename... Args>
   static T * invoke(Args... args)
   {
      std::function<T*(Args...)> creator = getCreator<Args...>();
      return creator(args...);
   }

   template <typename... Args> static std::function<T*(Args...)> getCreator() {
      return T::getBinding();
   }
   template <typename... Args> static std::function<T*(Args...)> m_bindingObj;
};

template <typename T> std::function<T*(Args...)> ToolFactory<T>::m_bindingObj;

int main()
{
   ToolFactory<ClassA>::invoke(1, 2, 3);

    return 0;
}

使用bobah提供的修复的拼写错误,我重新编写了示例,其中显示了使用m_bindingObj的示例。

代码语言:javascript
复制
#include <iostream>
#include <functional>

class ClassA
{
public:

   static ClassA * construct(int varA, int varB, int varC)
   {
      return new ClassA(varA, varB, varC);
   }


   ClassA(int varA, int varB, int varC)
      : m_varA(varA)
      , m_varB(varB)
      , m_varC(varC) {}

   static std::function<ClassA *(int, int, int)> getBinding() { return std::bind(&ClassA::construct, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); }

   int m_varA;
   int m_varB;
   int m_varC;
};

class ClassB 
{
public:

   static ClassA * construct(int varA, int varB, int varC)
   {
      return new ClassA(varA, varB, varC);
   }
   static std::function<ClassA *(int, int, int)> getBinding() { return std::bind(&ClassB::construct, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); }
};

template <class T>
class ToolFactory
{
public:

   template <typename... Args>
   static T * create(Args... args)
   {
      return m_bindingObj<Args...>(args...);
   }
   template<typename... Args> static void setBinding(std::function<T*(Args...)> functor) {
      m_bindingObj<Args...> = functor;
   }
   template <typename... Args> static std::function<T*(Args...)> m_bindingObj;
};

template<class T> template<typename... Args> std::function<T*(Args...)> ToolFactory<T>::m_bindingObj = T::getBinding();

int main()
{
    ToolFactory<ClassA>::setBinding(ClassB::getBinding());
    ClassA * instance = ToolFactory<ClassA>::create(1, 2, 3);

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-19 03:56:01

如果您需要variable template语法支持,那么您需要使用C++14,而且几乎没有输入错误。如果能看到一个m_bindingObj成员变量的用法示例,那就太好了,因为我的变量是否正确取决于此。

代码语言:javascript
复制
template <typename T>
class ToolFactory
{
   ...
   template <typename... Args> static std::function<T*(Args...)> m_bindingObj;
};

template <typename T>
template <typename... Args>
std::function<T*(Args...)> ToolFactory<T>::m_bindingObj;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52393483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档