【问题标题】:Calling template class member function through a pointer [why is this valid c++]?通过指针调用模板类成员函数[为什么这是有效的 c++]?
【发布时间】:2019-02-10 00:37:35
【问题描述】:

我正在查看大型分子动力学代码的源代码,发现了一些我不明白的地方。我在名为 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 或使用-&gt; 运算符。

编译器对这种情况的解读是否与我不同?

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

谢谢

【问题讨论】:

  • 您是否曾经实例化模板类并在某处调用testFunc() 函数?请参阅here
  • 我做了并且得到了和你一样的地方。但是,我从编译中获取的原始来源使用它就可以了。查看我所做的编辑。
  • 我看不到 . 运算符在哪里与 bufgbuf 一起使用。
  • 第 595 行将 gdata 定义为指向类型 T 的指针。第 556 行访问 buffer() 函数而不取消引用 gdata。
  • gdata 是一个 T 类型的 array,而不是指针。但它不应该工作,不。应该是g.buffer()buffer()

标签: c++ class templates pointers syntax


【解决方案1】:

答案是它不是有效的 C++ 语法。
请记住,Test 不是一个类,它是一个类的模板。这是您向编译器发出的关于如何为特定类型 T 构建 Test 类的指令如果您要求的话。 你没有要求它。

尝试添加类似的东西

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

你应该得到一个类似的错误

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

【讨论】:

  • 为什么是new??
  • 为什么这在原始应用程序中起作用?
  • @πάντα ῥεῖ - 因为我声明了一个 Test 指针。如果您更喜欢堆栈变量,那么 Test test; test.testFunc();
  • @MarkMackey,因为该模板从未使用过。
  • @binky 没有进一步的混乱和复杂性就可以了。查看我在评论中链接的内容。
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 2010-12-01
  • 2020-02-12
相关资源
最近更新 更多