模板的嵌套类型不依赖于模板参数

Nested Type of Template not depending on Template Arguments

提问人:Iuppiter Zeus 提问时间:9/19/2022 最后编辑:Iuppiter Zeus 更新时间:9/20/2022 访问量:134

问:

我一直在为以下问题而苦苦挣扎:

// this is in a header file
template <typename T>
struct Foo {
    T x, y;
    // ... other stuff

    struct Bar {
        int a, b;
        // ... other stuff
        void f() const;
    };

    Bar h() const
    { return { reinterpret_cast<int>(this->x), reinterpret_cast<int>(this->y) }; }
};

很明显,这需要在头文件中实现,因为它取决于模板参数。 但事实并非如此。 我想在一个单独的 .cpp 文件中实现它,因为它只需要编译一次,依此类推。Foo::h()Foo::Bar::f()

请注意:出于命名空间的原因,我想将其保留为嵌套类型。

有没有很好的方法可以做到这一点? 我不明白为什么这不应该起作用,因为根本不依赖于模板参数。Foo::Bar

谢谢!

编辑:修正了错别字

C++ 模板 嵌套类型

评论

3赞 Jarod42 9/19/2022
Foo<int>::Bar不一样,它们都需要一个定义......Foo<char>::Bar
1赞 Jarod42 9/19/2022
“很明显,Foo::g()”。上面的代码中没有。g()
2赞 463035818_is_not_an_ai 9/19/2022
里面的一切都取决于.真的是一切。可以有一个专业化,例如:FooTT = inttemplate <> Foo<int> {};
0赞 Iuppiter Zeus 9/19/2022
@Jarod42是的,我看到了,但另一方面,实现并不依赖于此。那么为什么需要多次编译呢?我的意思是,如果这是一个语言限制,我会使用它,但我看到了一些优化的潜力。和哎呀错别字:3
1赞 463035818_is_not_an_ai 9/19/2022
“好方法”是只把应该依赖其余的东西放在里面。例如,您可以考虑从非模板基类继承FooT

答:

2赞 The Dreams Wind 9/19/2022 #1

我不明白为什么这不应该起作用,因为 Foo::Bar 根本不依赖于模板参数

这是不正确的结论 - 嵌套类可以访问封闭类有权访问的所有名称(private、protected 等),因此根据封闭类的实例化方式,嵌套类具有不同的周围上下文,因此不是相同的类(准确地说 - 嵌套类是封闭类定义的一部分, 所以没有 /,不存在,但由于这些是不同的类,因此在这些类下也不同)Foo<int>::BarFoo<char>::BarFoo<int>Foo<char>BarBar

评论

0赞 Iuppiter Zeus 9/19/2022
谢谢!公平地说,在编译时无法知道类型,因此符号表没有意义(尽管它没有被使用)
1赞 apple apple 9/19/2022 #2

不知道“命名空间原因”是什么意思,但如果你只是想像 一样访问它,你可以使用别名。Foo<T>::Bar

struct ChocolateBar {
    int a, b;
    // ... other stuff
    void f() const;
};

template <typename T>
struct Foo {
    T x, y;
    // ... 
    using Bar = ::ChocolateBar;
    Bar h() const { return { reinterpret_cast<int>(this->x), reinterpret_cast<int>(this->y) }; }
};

评论

0赞 Iuppiter Zeus 9/19/2022
我所说的“命名空间原因”的意思是,我也希望能够在其他地方使用这个名字Bar
0赞 apple apple 9/19/2022
@IuppiterZeus你不需要命名外部类,或者你可以把它放在另一个命名空间中。Bar