加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用模板化基类成员编译错误

发布时间:2020-12-16 10:30:47 所属栏目:百科 来源:网络整理
导读:我正在尝试使用g编译一些Microsoft Visual C代码.现在我遇到了一个我真的无法理解的编译器错误. (简化)代码如下所示: templateint X struct A { templateclass Ret static Ret call() { return 0; }};templateint X struct B : AX { int f() { return AX::c
我正在尝试使用g编译一些Microsoft 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>();
    }
};

当我尝试用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

如果我从方法A :: call中删除模板类型(Ret),代码编译就好了.任何人都可以看到这里有什么不对吗?

谢谢!

解决方法

您需要模板关键字:

return A<X>::template call<int>();

call是一个依赖名称,这意味着它的表示取决于模板参数,当编译器处理f()时,该参数是未知的.您需要通过在模板关键字前添加前缀来指示该调用是函数模板.

当您尝试访问嵌套类型时会发生同样的事情:您需要添加typename关键字以指示名称表示类型:

template <typename T>
struct A { typedef int type; };

template <typename T>
void f()
{
    typename A<T>::type i = 0; // notice "typename" here
}

有时你甚至需要混合两者:

template <typename T>
struct A
{
    template <typename U>
    struct inner { };
};

template <typename T>
void f()
{
    typename A<T>::template inner<int> var;
}

在这个问题的答案中详细解释了这两个关键字的使用:Where and why do I have to put the “template” and “typename” keywords?(感谢@Bj?rnPollex查找链接).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读