微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不能从对象访问和使用成员类型别名?

如何解决为什么我不能从对象访问和使用成员类型别名?

是否无法从模板类的对象访问模板类的类型别名(或 typedef)?例如,为什么以下情况是不可能的:

template <typename TKey,typename TData>
class MyClass
{
public:
    using key_t = TKey;
    using data_t = TData;
    TKey key;
    TData data;
    MyClass(TKey _key,TData _data) : key(_key),data(_data) {  }
};

int main() {
    MyClass<int,float> mc{1,1.0f};
    using DataType = typename mc.data_t; //error: expected ';' after alias declaration
    mc.data_t newData = 2.0f; //error: Cannot refer to type member in 'MyClass<int,float> with '.'

    return 0;
}

还有其他方法可以做这样的事情吗?

解决方法

你的语法错误。改为:

int main() {
    MyClass<int,float> mc{1,1.0f};
    using DataType = typename MyClass<int,float>::data_t;
    MyClass<int,float>::data_t newData = 2.0f;
    return 0;
}

如果您想直接从 mc 获取别名,您可以 using DataType = decltype(mc)::data_t;。您实际上可以避免任何重复的 MyClass<int,float> :

int main() {
    MyClass<int,1.0f};  
    
    // suppose we cannot or do not want to spell out MyClass<int,float> again...  
    using my_class_t = decltype(mc);
    using data_t = my_class_t::data_t;
    data_t newData = 2.0f;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。