【问题标题】:Definition of a function outside of a generic class is producing a compilation error在泛型类之外定义函数会产生编译错误
【发布时间】:2020-10-11 00:50:34
【问题描述】:

上下文

我编写了以下最小的工作示例

#include <iostream>

template <typename T>
struct A {
  enum myenum {faa, fee, fii};
  myenum m_m;
  A(const myenum& m = faa): m_m(m) {}
};

int main() {
  A<int> a1;
  A<int> a2(A<int>::fii);

  std::cout << a1.m_m << std::endl
            << a2.m_m << std::endl;
  return 0;
}

编译并执行结果

$ g++ main.cpp && ./a.out
0
2

问题

但是,当函数的定义写在类之外(即如下图)

#include <iostream>

template <typename T>
struct A {
  enum myenum {faa, fee, fii};
  myenum m_m;
  A(const myenum& m);
};

template <typename T>
A<T>::A(const myenum& m = A<T>::faa): m_m(m) {}

int main() {
  A<int> a2(A<int>::fii);

  std::cout << a2.m_m << std::endl;
  return 0;
}

我得到以下编译错误

$ g++ main.cpp && ./a.out
main.cpp:11:1: error: redeclaration of ‘A<T>::A(const A<T>::myenum&)’ may not have default arguments [-fpermissive]
   11 | A<T>::A(const myenum& m = A<T>::faa): m_m(m) {}
      | ^~~~

问题

我怎样才能摆脱这个编译错误?

【问题讨论】:

  • 阅读错误信息并去掉定义中的默认参数。

标签: c++ templates default-arguments


【解决方案1】:

您必须在声明中指定default argument,并将其从定义中删除。

对于类模板的成员函数,必须在成员函数的初始声明中提供所有默认值。

template <typename T>
struct A {
  enum myenum {faa, fee, fii};
  myenum m_m;
  A(const myenum& m = faa);
};

template <typename T>
A<T>::A(const myenum& m): m_m(m) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多