g++;具有模板化基类成员的编译器错误 我试图用G++编译一些微软Visual C++代码。现在我遇到了一个编译器错误,我真的无法理解。(简化)代码如下所示: template<int X> struct A { template<class Ret> static Ret call() { return 0; } }; template<int X> struct B : A<X> { int f() { return A<X>::call<int>(); } }; 模板结构A{ 模板静态Ret调用(){ 返回0; } }; 模板结构B:A{ int f(){ 返回一个::call(); } };
当我尝试用g++(版本4.4.5)编译此文件时,我得到以下错误:g++;具有模板化基类成员的编译器错误 我试图用G++编译一些微软Visual C++代码。现在我遇到了一个编译器错误,我真的无法理解。(简化)代码如下所示: template<int X> struct A { template<class Ret> static Ret call() { return 0; } }; template<int X> struct B : A<X> { int f() { return A<X>::call<int>(); } }; 模板结构A{ 模板静态Ret调用(){ 返回0; } }; 模板结构B:A{ int f(){ 返回一个::call(); } };,c++,compiler-errors,g++,clang++,C++,Compiler Errors,G++,Clang++,当我尝试用g++(版本4.4.5)编译此文件时,我得到以下错误: main.cpp: In member function int B<X>::f(): main.cpp:16: error: expected primary-expression before int main.cpp:16: error: expected ; before int main.cpp:16: error: expected unqualified-id before > token m
main.cpp: In member function int B<X>::f():
main.cpp:16: error: expected primary-expression before int
main.cpp:16: error: expected ; before int
main.cpp:16: error: expected unqualified-id before > token
main.cpp:在成员函数int B::f()中:
main.cpp:16:错误:int之前应为主表达式
main.cpp:16:错误:预期;int之前
main.cpp:16:错误:在>令牌之前应为非限定id
如果我从方法A::call中删除模板类型(Ret),代码就可以正常编译。有人能看出这里出了什么问题吗
谢谢 您需要
模板
关键字:
return A<X>::template call<int>();
template<int X> struct B : A<X> {
int f() {
return A<X>::template call<int>();
}
};
有时你甚至需要将两者混合:
template <typename T>
struct A
{
template <typename U>
struct inner { };
};
template <typename T>
void f()
{
typename A<T>::template inner<int> var;
}
模板
结构A
{
模板
结构内部{};
};
模板
void f()
{
typename A::模板内部变量;
}
这两个关键字的用法在这个问题的答案中有详细的解释:(感谢@Björn Pollex找到了链接)。
A
是一个模板,在不知道X
的情况下,编译器无法确定A
的内容。尤其是它不知道call
最终会成为一个模板
要告诉编译器,您必须使用模板
关键字:
return A<X>::template call<int>();
template<int X> struct B : A<X> {
int f() {
return A<X>::template call<int>();
}
};
模板结构B:A{
int f(){
返回一个::模板调用();
}
};
您必须指定要调用的函数是模板,因为它是模板类的一部分。编译器不知道任何给定的A
都有一个名为call
的模板函数,因此您需要帮助它
template<int X> struct B : A<X> {
int f() {
return A<X>::template call<int>();
}
};
模板结构B:A{
int f(){
返回一个::模板调用();
}
};
提供了一个深入的解释,说明了何时以及为什么需要这样做。@BjörnPollex:谢谢,我实际上是在寻找这个确切的问题:)!可能重复的