提问人:Iuppiter Zeus 提问时间:9/19/2022 最后编辑:Iuppiter Zeus 更新时间:9/20/2022 访问量:134
模板的嵌套类型不依赖于模板参数
Nested Type of Template not depending on Template Arguments
问:
我一直在为以下问题而苦苦挣扎:
// 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
谢谢!
编辑:修正了错别字
答:
2赞
The Dreams Wind
9/19/2022
#1
我不明白为什么这不应该起作用,因为 Foo::Bar 根本不依赖于模板参数
这是不正确的结论 - 嵌套类可以访问封闭类有权访问的所有名称(private、protected 等),因此根据封闭类的实例化方式,嵌套类具有不同的周围上下文,因此不是相同的类(准确地说 - 嵌套类是封闭类定义的一部分, 所以没有 /,不存在,但由于这些是不同的类,因此在这些类下也不同)Foo<int>::Bar
Foo<char>::Bar
Foo<int>
Foo<char>
Bar
Bar
评论
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
评论
Foo<int>::Bar
不一样,它们都需要一个定义......Foo<char>::Bar
Foo::g()
”。上面的代码中没有。g()
Foo
T
T = int
template <> Foo<int> {};
Foo
T