C++ 使用现代C+时,带有私有构造函数的类的向量不编译+;
我正在编写的代码最初是使用C++ 使用现代C+时,带有私有构造函数的类的向量不编译+;,c++,c++17,C++,C++17,我正在编写的代码最初是使用C++03设计的,并且使用g++-std=C++03编译和函数时没有错误。我的目标是使用g++-std=c++17编译相同的代码 代码包含一个MyClass,其中包含一个NestedClass。只有MyClass才能使用、创建和修改NestedClass的实例,这些实例存储在std::vector中。同样地,NestedClass包含一个私有构造函数,并将MyClass和std::vector声明为好友 最简单的例子: #include <vector>
C++03
设计的,并且使用g++-std=C++03
编译和函数时没有错误。我的目标是使用g++-std=c++17
编译相同的代码
代码包含一个MyClass
,其中包含一个NestedClass
。只有MyClass
才能使用、创建和修改NestedClass
的实例,这些实例存储在std::vector
中。同样地,NestedClass
包含一个私有构造函数,并将MyClass
和std::vector
声明为好友
最简单的例子:
#include <vector>
class MyClass {
public:
class NestedClass {
friend class MyClass;
friend class std::vector< NestedClass >;
double _d;
NestedClass( double d = 0.0 ) : _d(d){ }
};
private:
std::vector< NestedClass > data;
public:
MyClass(){
data.resize( 40 );
}
};
int main(){
MyClass myclass = MyClass();
return 0;
}
如何重写代码,使其使用c++17进行编译
将
std::vector
更改为std::vector
不是一个选项,因为它需要重写使用MyClass
的代码,而我不控制这些代码。对于您的特定示例,最简单的修复方法是
data.resize( 40, {} );
自己调用私有构造函数,这样vector
只需要调用(隐式声明的)公共构造函数
一般来说,在你无法控制的图书馆里与某些东西交朋友是行不通的。你不知道所说的某件事是否真的会将工作委托给其他人 在向量的情况下,将所述工作委托给其他工作是非常必要的
正确的修复可能涉及对所涉及的类的更改。一种可能是PASKEY习惯用法:让构造函数是公共的,但只能用私有类型的参数调用。< /P>不能只为NeStdCype Pube构建构造函数吗?在任何版本的C++中,我都有同样的错误。它是有效的——“只有MyClass能够使用NestedClass的创建和修改实例”。如果
NestedClass
位于MyClass
的private
部分,但是NestedClass
的成员本身是public
@Bartek,而不是OP使用的编译器版本和命令行选项,那么我认为您的意图就会得到满足,请参阅。对于最小的示例,最小的修复是有效的。我将尝试在实际代码中实现,希望不会有任何问题。我能够按照您的建议修复代码。我删除了<代码>朋友STD::vector < NestEdCudio> < /Cord>声明,因为它现在已经没有用了,而不是使用列表初始化器<代码> {} /CoC>我明确地调用<代码> MyClass::NeStdCaseCub()/Cuth>。这样,代码将用现代C++和旧版本编译。谢谢你的帮助。
data.resize( 40, {} );