Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;使用模板的未定义引用_C++_Templates - Fatal编程技术网

C++ c++;使用模板的未定义引用

C++ c++;使用模板的未定义引用,c++,templates,C++,Templates,因此,我有以下代码: template<class T> class A { public: class B { public: virtual void Destroy(T obj); }; B &_b; A(B b) : _b(b) { } void Go(T obj) { _b.Destroy(obj); } }; class X : public A<int>::B { public:

因此,我有以下代码:

template<class T>
class A
{
public:

  class B
  {
  public:
    virtual void Destroy(T obj);
  };

  B &_b;

  A(B b) : _b(b)
  {
  }

  void Go(T obj)
  {
    _b.Destroy(obj);
  }
};

class X : public A<int>::B
{
public:
  void Destroy(int x)
  {
    //do something
  }
};

int main()
{
  X x;
  A<int> a(x);
  a.Go(5);
  return 0;
}
模板
甲级
{
公众:
B类
{
公众:
虚拟空洞破坏(T-obj);
};
B&U B;
甲(乙):(乙)
{
}
无效Go(T obj)
{
_b、 销毁(obj);
}
};
类别X:公共A::B
{
公众:
无效销毁(int x)
{
//做点什么
}
};
int main()
{
X;
A(x);
a、 Go(5);
返回0;
}
但我得到一个编译错误:

undefined reference to 'A<int>::B::Destroy(int)'
对“A::B::Destroy(int)”的未定义引用
我以前见过在单独的.hpp和.cpp文件中执行模板时出现的问题。。。但这些都在一个文件中

谢谢。

  • 虚拟空洞破坏(T-obj)未实现。实现它或将它标记为虚拟纯
    =0

  • 没有
    X

  • a.Go()
    错误,
    Go
    应采用参数

      • 虚拟空洞破坏(T-obj)未实现。实现它或将它标记为虚拟纯
        =0

      • 没有
        X

      • a.Go()
        错误,
        Go
        应采用参数


      您尚未在
      B
      中提供
      Destroy()
      的实现,例如:

      template<class T>
      void A<T>::B::Destroy(T a) {
        // do something
      }
      
      模板
      作废A::B::销毁(TA){
      //做点什么
      }
      

      请注意,您还有其他编译错误:在类B的主体之后缺少分号,在调用
      Go()

      中缺少参数。您尚未在
      B
      中提供
      Destroy()
      的实现,例如:

      template<class T>
      void A<T>::B::Destroy(T a) {
        // do something
      }
      
      模板
      作废A::B::销毁(TA){
      //做点什么
      }
      

      请注意,您还有其他编译错误:在类B的主体之后缺少分号,在调用
      Go()
      时缺少参数,为
      虚拟无效销毁(T obj)添加定义

      • 在适当的地方:

        class B
        {
        public:
            virtual void Destroy(T obj) { /* here! */ }
            // ==== ALTERNATIVELY: ====
            virtual void Destroy(T obj) = 0;  // pure-virtual
        };
        
      • 或之后:

        template <typename T>
        void A<T>::B::Destroy(T obj) { /* here. */ }
        

        添加
        虚拟空洞破坏(T obj)的定义

        • 在适当的地方:

          class B
          {
          public:
              virtual void Destroy(T obj) { /* here! */ }
              // ==== ALTERNATIVELY: ====
              virtual void Destroy(T obj) = 0;  // pure-virtual
          };
          
        • 或之后:

          template <typename T>
          void A<T>::B::Destroy(T obj) { /* here. */ }
          

          太棒了,谢谢!我忘记了
          =0
          使其成为纯虚拟。哦,天哪,我一生都在拼写“alternative”(交替)错误:(太棒了,谢谢!我忘记了
          =0
          使其成为纯虚拟。哦,天哪,我一生都在拼写“alternative”:(