通过指针调用模板类成员函数[为什么这个有效的c ++]?

时间:2018-09-05 00:11:29

标签: c++ class templates pointers syntax

我一直在寻找大量的《分子动力学》代码的源代码,发现我不了解的内容。我在名为test.cpp的文件中创建了一个简单的测试用例(如下所示):

template <class T> class Test {
  public:
    void testFunc() {
      T *ptr1;
      ptr1 = ptr1.function();
    }
}

如果您按以下方式调用编译器,则可以使用GNU的g ++和Intel的icpc进行编译:

$CXX -o test.o -c test.cpp

我不明白为什么这是有效的c ++语法。要访问从来没有定义过的function(),我必须取消引用ptr1或使用->运算符。

编译器对这种情况的理解与我不同吗?

如果要查看我在哪里找到的原始源,请签出此文件的第556行和595行: https://www.ks.uiuc.edu/Research/namd/doxygen/MsmMap_8h-source.html

谢谢

1 个答案:

答案 0 :(得分:0)

答案是它不是有效的C ++语法。
请记住,Test不是一个类,它是一个类的 template 。根据您的要求,这是向编译器的指示,说明如何为特定类型T 构造Test类。 您没有要求它。

尝试添加类似内容

Test< int > *test = new Test< int >();
test->testFunc();

您应该收到类似

的错误
error: request for member 'function' in 'ptr1', which is of non-class type 'int*'