다음은 제가 작업중인 사용 사례의 작은 버전입니다.
#include <mutex>
template<typename T = float>
class Foo
{
public:
Foo(int x, int y):m_mutex(){}
private:
std::mutex m_mutex; // This is must have in my project
};
typedef Foo<float> Foo_typedef;
class Func
{
public:
static Foo_typedef static_array[2];
};
Foo_typedef Func::static_array[2] = { Foo_typedef(2,3), Foo_typedef(2,3) };
int main()
{
return 0;
}
이 VS 2015 업데이트 2를 컴파일하면 다음 오류가 발생합니다.
error C2280: 'Foo<float>::Foo(const Foo<float> &)': attempting to reference a deleted function
note: see declaration of 'Foo<float>::Foo'
나는 주위를 둘러 보았고 이것이 두 가지 이유 중 하나가있을 것이라고 생각했다.
1)에 대한 복사 생성자 멤버 std::mutex
가 삭제되었습니다.
2) 이것은 내가보고있는 것과 비슷할 것이라고 생각했습니다.
어떤거야? VS 2015 업데이트 2 컴파일러에서 발생한이 오류를 우회하려면 어떻게해야합니까?
UPDATE : 전달해야하는 일부 매개 변수를받는 생성자를 업데이트했습니다 Foo_typedef
.
생성자를 사용하여 요소를 제자리에 생성해야합니다.
Foo_typedef Func::static_array[2] = { {2, 3}, {2, 3} };
이를 통해 두 요소가 제자리에 구성되기 때문에 복사 또는 이동이 없습니다 .
표준은 다음과 같습니다 (§8.5.1 / 2 [dcl.init.aggr], 강조는 내 것임).
이니셜 라이저 목록에 의해 집계가 초기화되면 [...] 이니셜 라이저 목록의 요소가 집계 [...] 의 멤버에 대한 이니셜 라이저 로 간주됩니다 .
귀하의 경우 Foo_typedef(2,3)
에는 이니셜 라이저 로 사용 Foo_typedef
되므로 사본이 필요합니다. 내가 준 코드 {2, 3}
에서 이니셜 라이저 로 사용되며 해당 생성자가 호출됩니다 (복사 없음).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다