【问题标题】:Can not access member type from base-class when compiled using c++17 [duplicate]使用c ++ 17编译时无法从基类访问成员类型[重复]
【发布时间】:2020-04-25 16:35:29
【问题描述】:

我有以下代码在 中编译成功。

template<class T, class ...Args>
class B 
{
public:
   using AbcData = int;
};

template<typename ...Args>
class D : public B<float, Args...>
{
public:
   AbcData m_abc;
};

但是在编译时,会报如下错误。

error C2061: syntax error: identifier 'AbcData'

代码有什么问题以及如何解决?

【问题讨论】:

  • 这也不应该在 C++14 上编译。
  • 我正在使用 VisualStudio 2017。它在 c++14 中编译。
  • 不应该。它一直是不正确的。 Demo.
  • 它不能在带有/Za 的 MSVC 上编译,也许它们有扩展或其他东西。

标签: c++14 c++17 c++ templates c++14 c++17 class-template


【解决方案1】:

当基类B类依赖模板参数时,即使派生类D这里类型别名AbcData继承自B,在D类中简单使用AbcData,也不是够了。

你需要明确,从哪里来

template<typename ...Args>
class D : public B<float, Args...>
{
public:
    typename B<float, Args...>::AbcData m_abc; // --> like this
};

【讨论】:

  • 这是否向后兼容 c++14 语法?
  • @acegs 你是不是这个意思:godbolt.org/z/qczVg7 ?
  • 如果AbcData 没有歧义,您可以使用D 本身而不是基类B&lt;float, Args...&gt; 来使名称依赖。这可能更直接。
  • 我多次使用AbcData,所以我使用了using AbcData = B&lt;float, Args...&gt;::AbcData。它现在正在工作。有没有更好的选择,更短,更少指定过多的冗余细节?我还有来自基类的其他数据类型,而不仅仅是AbcData
  • @acegs 你的行不应该编译。它需要typenameB 之前,您可以使用using typename B&lt;float, Args...&gt;::AbcData; 代替。
猜你喜欢
  • 2014-08-22
  • 2012-11-20
  • 2012-10-29
  • 2011-02-03
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2014-01-26
相关资源
最近更新 更多