gpt4 book ai didi

c++ - 为什么模板类中的函数声明无效?

转载 作者:可可西里 更新时间:2023-11-01 17:57:30 26 4
gpt4 key购买 nike

考虑以下代码:

template<int X, int Y>
struct S
{
typedef int func(int,float) const;
};

template<int X>
struct D : public S<X,6>
{
typename S<X,6>::func func;
};
template<int X>
int D<X>::func(int,float) const
{
return 1;
}
//----------------
struct W : public S<7,8>
{
S<7,8>::func func;
};
int W::func(int,float) const
{
return 2;
}

#include <iostream>
int main()
{
W w;
std::cout << w.func(1,4.3) << "\n";
D<3> d;
std::cout << d.func(1,4.3) << "\n";
}

如果我注释掉声明类 D 的代码和 D::func()以及 main() 中的相应行,代码编译正常,我看到 2在输出中,正如预期的那样。

但是当我制作派生类模板时(在函数声明之前添加 typename,因为 S<X.6> 是一个依赖范围),我得到以下错误:

test.cpp:13:27: error: no ‘int D<X>::func(int, float) const’ member function declared in class ‘D<X>’
int D<X>::func(int,float) const
^
test.cpp: In instantiation of ‘struct D<3>’:
test.cpp:32:10: required from here
test.cpp:10:27: error: field ‘D<3>::func’ invalidly declared function type
typename S<X,6>::func func;
^
  • 为什么我不能申报func在模板派生类中,而在非模板类中可以吗?
  • “无效声明的函数类型”到底是什么?这里有什么无效的?

最佳答案

N3337 [dcl.fct]/10: A typedef of function type may be used to declare a function but shall not be used to define a function.

根据这条规则,DW 在技术上都是良构的。我认为这不能用 GCC 或 Clang 编译的原因是用 typedef 声明一个函数是非常罕见的。使用依赖于模板参数的成员 typedef 声明函数的情况更为罕见。看起来您刚刚遇到了一个编译器支持有限的黑暗角落。

有趣的是,MSVC 实际上是 does the right thing在这里。

您最好的选择可能是找到一种不同的方式来表达您的类(class)。在不了解您要解决的问题的更多信息的情况下,我真的无法提供任何直接建议,但如果您提出新问题并提供详细信息,我们可以提供一些建议。

您可能还会考虑为 GCC 提交错误报告和 Clang .


编辑:

但是,正如 Jarod42 指出的那样,依赖类型稍后可能被定义为函数类型以外的其他类型,从而使声明无效。 MSVC 在 GCC 和 Clang 不工作的地方工作的原因与 MSVC 在某些地方不需要 typename 的原因相同:它没有正确实现两阶段查找。完全指定这种情况将需要类似 function_typename 的东西来将依赖名称标记为函数类型。我认为基于依赖类型声明一个函数是不明确和不一致的,因为这是一种非常罕见的情况。

关于c++ - 为什么模板类中的函数声明无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com