C++을 처음 사용하고 코드가 어떻게되는지 정확하게 이해하려고합니다.빈 생성자를 사용하지 않고 컴파일이 실패합니다.
이 클래스들은 모두 자체 헤더 파일에 정의되어 있습니다. 코드는 다음과 같습니다.
대기열 :
template<class T> class Queue
{
public:
Queue(unsigned int size)
{
_buffer = new T[size]; //need to make sure size is a power of 2
_write = 0;
_read = 0;
_capacity = size;
}
/* other members ... */
private:
unsigned int _capacity;
unsigned int _read;
unsigned int _write;
T *_buffer;
};
직렬 :
template<class T> class Queue;
template<class T> class Serial
{
public:
Serial(unsigned int buffer_size)
{
_queue = Queue<T>(buffer_size); //<---here is the problem
}
private:
Queue<T> _queue;
};
이 같은 일련의 인스턴스를 만들려고 :
Serial<unsigned char> s = Serial<unsigned char>(123);
컴파일러는 더 큐 생성자가 없음을 불평 제로 논쟁으로, 적어도 그것은 내가 오류라고 생각하는 것입니다 :
In instantiation of 'Serial<T>::Serial(unsigned int) [with T = unsigned char]': no matching function for call to 'Queue<unsigned char>::Queue()' ambiguous overload for 'operator=' in '((Serial<unsigned char>*)this)->Serial<unsigned char>::_queue = (operator new(16u), (((Queue<unsigned char>*)<anonymous>)->Queue<T>::Queue<unsigned char>(buffer_size), ((Queue<unsigned char>*)<anonymous>)))' (operand types are 'Queue<unsigned char>' and 'Queue<unsigned char>*') invalid user-defined conversion from 'Queue<unsigned char>*' to 'const Queue<unsigned char>&' [-fpermissive] invalid user-defined conversion from 'Queue<unsigned char>*' to 'Queue<unsigned char>&&' [-fpermissive] conversion to non-const reference type 'class Queue<unsigned char>&&' from rvalue of type 'Queue<unsigned char>' [-fpermissive]
나는 그것이 아무런 문제없이 컴파일 큐에 빈 생성자를 추가 할 때. 디버거를 단계별로 실행할 때 빈 매개 변수가 아닌 매개 변수를 사용하여 생성자로 들어갑니다.
왜 이런 일이 발생합니까?
언어는 기능 클래스를 자동으로 생성 얻을 무엇과 관련된 규칙을 많이했다. 인수를 사용하여 생성자를 정의하면 컴파일러에서 만들어지는 함수를 수정합니다. 귀하의 경우, 인수를 사용하여 생성자를 정의 했으므로 기본 (빈) 생성자를 얻지 못했습니다. 코드에 기본값이 필요합니다 (게시 된 답변 참조). – ttemple
[this one] (https://www.ideone.com/OOdq5n)과 같이 [mcve]를 만들어야합니다. 이 문제는 템플릿, 대기열, 헤더 파일 등과는 아무런 관련이 없습니다. – PaulMcKenzie
https://stackoverflow.com/questions/4782757/rule-of-three-becomes-rule-of-five-with-c11#4782927 생성자를 만들 때 일반적으로 다른 함수 (복사 생성자, 할당 등)와 그 이유를 만들어야합니다. 제안 된 3 또는 5 중 하나만 만들었습니다. – ttemple