3

我有一个像下面这样在 vc++ 工作的 c++ 类,但在 linux gcc 4.7 中不再工作了。而且我不知道如何让它再次工作。

测试.h

template<typename a>
class test: public a
{
public:
    void fun();
};

测试.cpp

template<typename a>
void test<a>::fun()
{
   template_class_method(); <-- this is a public method from template_class 
}
    template class test<template_class>;

模板类.h

class template_class {
public:
    template_class();
    virtual ~template_class();
    void template_class_method();

};

模板类.cpp

#include "templateclass.h"

template_class::template_class() {
    // TODO Auto-generated constructor stub

}

template_class::~template_class() {
    // TODO Auto-generated destructor stub
}

void template_class::template_class_method() {
}
4

2 回答 2

9

您需要使用基类名称对其进行限定:

a::template_class_method();

资格a::是必要的,因为template_class_method存在于a. C++ 规则是,如果基类是类模板或模板参数,则其所有成员不会自动对派生类可见。为了帮助编译器找到成员,您需要告诉它在基类中查找成员,您需要为该成员base::member_function()限定or形式的成员base::member_data

在您的情况下,由于基数是a,而成员是template_class_method,所以您必须这样写:

a::template_class_method();

请注意,这样的基类称为依赖基类,因为它依赖于模板参数。

于 2012-12-20T07:53:46.663 回答
2

我不知道为什么@Karthik T 删除了答案,但那个答案是正确的。你有几个选择

  1. 使用限定名a::template_class_method()

    template<typename a>
    class test : public a
    {
    public:
      void fun()
      {
        a::template_class_method();
      }
    };
    
  2. 使用类成员访问语法this->template_class_method()

    template<typename a>
    class test : public a
    {
    public:
      void fun()
      {
        this->template_class_method();
      }
    };
    
  3. 通过 using-declaration 使基类方法可见

    template<typename a>
    class test : public a
    {
    public:
      using a::template_class_method;
      void fun()
      {
        template_class_method();
      }
    };
    

请注意,第一种方法会抑制虚拟性template_class_method(如果是虚拟的),因此应谨慎使用。因此,首选方法 2,因为它保留了template_class_method.

您说this->template_class_method()“不起作用”的评论不清楚。它没有任何问题。此外,正如我上面所说,这通常是比使用限定名称更好的选择。

于 2012-12-20T08:43:46.300 回答