C++ 在模板类中调用模板方法

C++ 在模板类中调用模板方法,c++,templates,C++,Templates,我试图弄清楚为什么一些我没有编译过的代码,我做了一点简化,匿名化,最后得到了这个例子: #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; templa

我试图弄清楚为什么一些我没有编译过的代码,我做了一点简化,匿名化,最后得到了这个例子:

#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;
}
#定义空((void*)0)
模板
甲级{
公众:
模板
T*amem(){
返回NULL;
}
};
模板
b类{
公众:
a*ap;
模板
T*m(){
返回ap->amem();
}
};
int main()
{
返回0;
}
根据我使用的编译器和变量的名称,我会得到不同的错误。它们都围绕着这条线,不过:

    return ap->amem<b>();
返回ap->amem();
使用clang++[Apple clang版本4.0(tags/Apple/clang-421.0.57)(基于LLVM 3.1svn)]编译时,我得到以下消息:

tmp.cpp:18:26: error: expected expression
      return ap->amem<b>();
                         ^
1 error generated.
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
tmp.cpp:18:26:错误:预期表达式
返回ap->amem();
^
生成1个错误。
使用g++[i686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1]编译时,我得到以下消息:

tmp.cpp:18:26: error: expected expression
      return ap->amem<b>();
                         ^
1 error generated.
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
tmp.cpp:在成员函数“T*b::m()”中:
tmp.cpp:18:错误:在“>”标记之前应该有主表达式
tmp.cpp:18:错误:在“')标记之前应该有主表达式
神秘地(对我来说,无论如何)。如果我将amem的名称改为m,我不再从g++中得到任何错误,但从clangg++中得到相同的错误

我肯定这里有些东西我就是不明白?有人知道clang和gcc在寻找什么表达式吗?有人知道如何解决这个问题吗


如果这是一个编译器错误(似乎有疑问),有人知道任何不涉及将amem转换为带有bool参数(而不是模板)的函数的解决方法吗?我已经这样做了,我可以确认这可以解决这个问题,但这是在一个热循环中,由b打开的代码是一个内存分配,可能不应该在热循环中。

需要添加
模板
关键字:

return ap->template amem<b>();
返回ap->template amem();

请阅读以获得深入的解释。

在您呼叫的上下文中

return ap->amem<b>();

顺便说一句,请注意,不应定义
NULL
!如果你需要一个令人憎恶的定义,你应该包括,例如,
cstdef
。最好使用< <代码> 0 < /> >或<代码> null ptr>代码>当使用C++ 2011。< /p>疯狂。我不知道模板的用法。我已经在类型上用过很多次了,但从来没有在函数上用过。谢谢你的回答。我从未在实际代码中定义NULL,但我在这里这样做是为了使示例尽可能自包含。