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

Why can't I access and use a member type aliases from an object?

是否无法从 class 的对象访问模板化 class 的类型别名(或 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, float> mc{1, 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;
}