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++;具有模板化基类成员的编译器错误 我试图用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

当我尝试用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
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:谢谢,我实际上是在寻找这个确切的问题:)!可能重复的