我正在查看大型分子动力学代码的来源,发现了一些我不理解的东西。我在一个名为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
谢谢
答案是它不是有效的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*'