【发布时间】:2016-09-03 23:43:26
【问题描述】:
我有一个包含内部类的模板类。在 operator=() 重载上,我想复制内部类的一个实例,但出现错误:
no known conversion from 'const foo<double>::bar' to 'const foo<int>::bar'
代码看起来像(你可以找到一个例子here):
template<typename T>
class foo {
public:
template<typename>
friend class foo;
class bar {
std::string inner_str;
public:
bar const& operator=(bar const& r) {
inner_str = r.inner_str;
return *this;
}
};
template<typename F>
foo const& operator=(foo<F> const& r) {
value = static_cast<T>(r.value);
str_container = r.str_container;
return *this;
}
private:
bar str_container;
T value;
};
将bar 移到foo 之外可以正常工作,但内部类应该是foo 的一部分。
如何解决这个问题?我想过让bar 像 foo 这样的朋友成为 foo 的所有专业的朋友。但是不知道怎么介绍。
旁注:请随意更改标题,因为我真的不知道如何命名这个特定问题。
【问题讨论】:
-
应该
foo<A>::bar是与foo<B>::bar无关的类型吗?如果没有,您可以创建一个以bar作为内部类型的基类,并从中派生您的foo<T>实例。 -
好主意,但这也需要 foo 之外的类。还有其他可能吗?
-
你为什么不想要
foo之外的课程? -
所以我们很清楚,我说的是this。
-
foo 是一种在不同组件之间共享的接口。简单地说,如果界面包含所有内容,而不是将它们分开,那就太好了。如果不可能,那么如果 bar 在外面就好了,但我认为在 c++ 中应该是可能的,我只是错过了一些东西。也很高兴知道该怎么做。
标签: c++ templates inner-classes assignment-operator