c++ - 在泛型类之外定义函数会产生编译错误
问题描述
上下文
我写了以下最小的工作示例
#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) {}
| ^~~~
问题
我怎样才能摆脱这个编译错误?
解决方案
您必须在声明中指定默认参数,并将其从定义中删除。
对于类模板的成员函数,必须在成员函数的初始声明中提供所有默认值。
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) {}
推荐阅读
- azure - CosmosDB 更改提要、租约和 azure 函数
- elasticsearch - 从 Apache Calcite 执行查询到安全的 ElasticSearch 服务器 (https)
- r - covr::package_coverage 报告“没有这样的文件或目录”
- python - 如何比较同一数据集中的两列?
- google-sheets - 基于跨两个工作表的匹配标准的 sumproduct 工作表公式
- tsql - Microsoft SSIS 包从 Visual Studio 和 SSMS 集成服务目录手动成功运行,但不是通过 SQL Server 代理
- php - Laravel 5 webapp由于mbstring而无法工作
- xamarin.forms - Microsoft.NetNative 编译导致警告 ILT0003
- sikuli - 这是 CMD Shift Down 的正确语法吗?
- android - FirebaseUI 中的适配器为空