Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用现代C+时,带有私有构造函数的类的向量不编译+;_C++_C++17 - Fatal编程技术网

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, {} );