我试图弄清楚为什么我的一些代码将无法编译,并且我做了一些减少匿名化以结束这个例子:
#define NULL ((void*)0)
template<typename T>
class a {
public:
template<bool b>
T * amem() {
return NULL;
}
};
template<typename T>
class b {
public:
a<T>* ap;
template <bool b>
T * m() {
return ap->amem<b>();
}
};
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我使用的编译器和变量的名称,我得到不同的错误.尽管如此,它们都围绕着这条线:
return ap->amem<b>();
Run Code Online (Sandbox Code Playgroud)
使用clang ++进行编译[Apple clang 4.0版(标签/ Apple/clang-421.0.57)(基于LLVM 3.1svn)],我收到以下消息:
tmp.cpp:18:26: error: expected expression
return ap->amem<b>();
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
使用g ++编译[i686-apple-darwin11-llvm-g ++ - 4.2(GCC)4.2.1],我收到以下消息:
tmp.cpp: In member function ‘T* b<T>::m()’:
tmp.cpp:18: error: expected primary-expression before ‘>’ token
tmp.cpp:18: error: expected primary-expression before ‘)’ token
Run Code Online (Sandbox Code Playgroud)
神秘地(对我来说,无论如何).如果我将amem的名称更改为m,我不再从g ++中获得任何错误,但是我从clang ++中得到了同样的错误.
我确定这里有些东西我不明白?有谁知道clang和gcc正在寻找什么表达?有谁知道如何解决这个问题?
如果这是一个编译器错误(看起来很可疑),有没有人知道任何不涉及将amem转换为带有bool参数的函数(而不是模板)的变通方法?我已经完成了这个,我可以确认这可以解决这个问题,但这是在一个热循环中,由b打开的代码是一个可能不应该在热循环中的内存分配.
Jes*_*ood 20
需要添加template关键字:
return ap->template amem<b>();
Run Code Online (Sandbox Code Playgroud)
请阅读"我在哪里以及为什么要放置"模板"和"typename"关键字?进行深入解释.