gpt4 book ai didi

c++ - 如何引用作为模板参数传递的派生类中定义的类型?

转载 作者:行者123 更新时间:2023-11-30 01:42:00 25 4
gpt4 key购买 nike

考虑以下示例:

template <typename T>
class A {
private:
typedef typename T::C C;
};

template <typename T>
class B : public A<B<T>> {
public:
typedef T C;
};

int main() {
B<int> b;
}

使用 GCC 编译它会出现以下错误:

test.cc:5:23: error: no type named 'C' in 'B<int>'
typedef typename T::C C;
~~~~~~~~~~~~^
test.cc:9:18: note: in instantiation of template class 'A<B<int> >' requested here
class B : public A<B<T>> {
^
test.cc:15:10: note: in instantiation of template class 'B<int>' requested here
B<int> b;
^

如果定义了 B::C,为什么编译器会报错?如何解决?

最佳答案

此时,

class B : public A<B<T>> {

…类 B 不完整。 A 类无法查看其内部。

B 中的 C 类型定义可以从 B 中的那个点访问,等等。它也可以在 B 中的函数体内使用,因为您可以将类定义内的函数定义视为将其放在类之后的简写。但是从外部来看,一个不完整的类不包含任何内容:外部代码所能做的就是形成指针和引用,并将该类用作模板参数。

template< class C >
using Ungood = typename C::Number;

struct S
{
void foo() { Number x; (void) x; } // OK
Ungood<S> uhuh; //! Nyet.

using Number = double;
};

auto main() -> int {}

您可以通过更改设计来修复您的代码。最明显的是将类型作为单独的模板参数传递。但是,根据您要实现的目标,您当前拥有的继承权可能并不是真正需要的,甚至没有用处。

关于c++ - 如何引用作为模板参数传递的派生类中定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40370903/

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