gpt4 book ai didi

c++ - 来自不同命名空间的模板模板参数可以成为 friend 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:40 25 4
gpt4 key购买 nike

如果这个问题的标题没有帮助,我深表歉意;如果不给出以下示例,我不知道如何简洁地提出这个问题:

template <template <class> class Arg>
class C {
typedef C<Arg> type;
friend class Arg<type>;
public:
C() {
a_.set(this);
}
private:
int i_;
Arg<type> a_;
};

template <class Type>
class Arg1 {
public:
void set(Type* t) {
t_ = t;
t_->i_ = 1;
}
private:
Type* t_;
};

namespace NS {

template <class Type>
class Arg2 {
public:
void set(Type* t) {
t_ = t;
t_->i_ = 2;
}
private:
Type* t_;
};

}

如您所见,Arg2Arg1 的拷贝.然而,VS 2008 只允许 Arg1用作模板参数:

int main() {
C<Arg1> c1; // compiles ok
C<NS::Arg2> c2; // error C2248

return 0;
}

错误是'C<Arg>::i_' : cannot access private member declared in class 'C<Arg>' .如果 i_ 一切正常被公开了,所以这似乎是一个友元问题。

当模板模板参数位于不同的命名空间时,是什么导致友元声明失败?

最佳答案

命名空间成员资格不影响友元资格。这是一个编译器错误。

friendnamespace但是,它们是相互影响的语言特性,因此随着错误的出现并不特别令人惊讶。也许它实际上是在封闭的命名空间 ::Arg2<type> 中加入一个无意义的前向声明。 .

关于c++ - 来自不同命名空间的模板模板参数可以成为 friend 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077356/

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