0

C2248 오류는 stackoverflow에서 새로 추가되지 않습니다. 불행하게도, 난 부스트 라이브러리를 사용하여 초보자 그리고 난 내 코드에서 오류를 수정할 수 없습니다 해요 :다시 오류 C2248

// .h file 

using namespace boost::interprocess; 
using namespace std; 

class CMsqQueueMngr { 

public: 
    // constructors & destructors 
    CMsqQueueMngr(); 
    ~CMsqQueueMngr(); 

    int Open(char *queueName, int mode); 
    int Close(); 
    int Read(uint8_t *data, int count); 
    int Write(uint8_t *data, int count, int priority); 

    boost::interprocess::message_queue mq; 

private: 
    std::string mqName; 

}; 

// .cpp file 

CMsqQueueMngr::CMsqQueueMngr() 
{} **<=== ERROR C2248** 

CMsqQueueMngr::~CMsqQueueMngr() 
{} 

int CMsqQueueMngr::Open(char *queueName, int mode) 
{ 
    try{ 
     //Erase previous message queue 
     message_queue::remove(queueName); 

     mqName.assign(queueName); 

     //Create a message_queue. 
     mq 
      (create_only    //only create 
      , queueName     //name 
      , 100      //max message number 
      , sizeof(int)    //max message size 
      ); **<=== ERROR C2064 ** 


     //Send 100 numbers 
     for (uint8_t i = 0; i < 100; ++i){ 
      mq.send(&i, sizeof(i), 0); 
     } 
    } 
    catch (interprocess_exception &ex){ 
     std::cout << ex.what() << std::endl; 
     return -1; 
    } 

    return 0; 

} 

컴파일러 오류 :

오류 C2248 : '부스트 :: 간 :: message_queue_t> :: message_queue_t 'class'boost :: 간 :: message_queue_t 선언 private 멤버에 액세스 할 수 없습니다>

오류 C2064 : 항은 함수 복용 평가 4 개 인수

하지 않습니다

mq에 액세스하려면 어떻게해야합니까?

+0

좀 더 혼란스러운 오류를 정말로 원하지 않는다면 헤더에서'using namespace' 문을 제거하는 것이 좋습니다. – pmr

+0

컴파일러가 말하는 것을 이해하려면 생성자와 초기화 목록을 자세히 살펴야합니다. 나는 이것을 [대답] (http://stackoverflow.com/a/28276590/2932052)에 집중하려고했다. – Wolf

+0

... 액세스 할 수없는 변수 ** mq **가 아닙니다. – Wolf

답변

0

당신은 클래스를 포함하는의 생성자에서 message queue 객체 mq을 만들어야합니다,

CMsqQueueMngr::CMsqQueueMngr(): 
    mq(create_only, "my_first_queue_name", 100, sizeof(int)) 
{ 
} 

메시지 큐 개체에 대한 액세스 가능한 default constructor (이 있기 때문에 당신은 initalizer list을 사용하여 수행해야 mq과 같은). 이것은 생성자의 닫는 중괄호 뒤에있는 컴파일러의 메시지 C2248의 의미입니다.

BTW : 구성원을 정상적인 방법으로 초기화 할 수 없습니다. 이는 컴파일러가 Open 메서드에서 잘못 (따라서 C2064) 것으로 판단한 것입니다. mq.send에 대한 호출이 예상대로 (적어도 한 번) 작동하는 반면 일부 오류 (또는 오해 또는 열린 끝)가 있습니다.


[업데이트]

또는, 당신은 스택에 변수로 부스트의 메시지 큐에 액세스 할 수 있습니다 :

/// abbreviate name boost::interprocess::message_queue 
using boost::interprocess::message_queue; 

class CMsqQueueMngr { 

public: 
    CMsqQueueMngr(const std::string& queue_name); 

    void WriteInt(int data); 

    // (some methods omitted) 

private: 

    /// name of the queue 
    std::string mqName; 

}; 

CMsqQueueMngr::CMsqQueueMngr(const std::string& name): 
    mqName(name) 
{ 
} 

void CMsqQueueMngr::WriteInt(const int data) 
{ 
    // create a queue for max 100 values at first call, open if existing 
    message_queue mq(open_or_create, mqName.c_str(), 100, sizeof (data)); 
    mq.send(&data, sizeof(data), 0); 
} 

...이 시도하지 않은,하지만 경우 가능하지 않다면 the static remove method은별로 의미가 없습니다.

+0

늑대에게 감사합니다. 귀하의 솔루션이 작동합니다. – cris1967

+0

은 실제로 이러한 방식으로 (상기 참조) 울리히 의해 제안 된 솔루션을 사용했을 – cris1967

+0

CMsqQueueMngr (CHAR * QUEUENAME) (create_only, QUEUENAME, 100는 sizeof (INT)) MQ { \t \t mqName.assign (QUEUENAME); – cris1967

0

여기서 오류는 생성자가 개인이므로 호출 할 수 없다는 것을 의미합니다. 또한 명시 적으로 호출하지 않으므로 CMsqQueueMngr의 일부로 기본 생성자가 호출됩니다. 의도적으로 private이기 때문에, 적절한 생성자 나 비슷한 것을 호출해야하지만, 사용하려고하지 않은 방식으로 클래스를 사용하려고합니다. 해결책은 지침을 연구하는 것입니다.

CMsqQueueMngr::CMsqQueueMngr(char *queueName): 
    mq(create_only, queueName, 100, sizeof (int)) 
{} 

참고 : 그에서, 무엇을해야할지, 즉 초기화 목록을 통해 적절한 인수를 전달 명확해야

  • 코드는 이제 단지의 ctor에 하나의 인자를 수신하므로, 그것을 explicit로 만들어야합니다.
  • std::string을 사용하면 (const이 아닌) char에 대한 포인터를 사용하면 안됩니다.
  • 일반적으로 "const correctness"에 대한 아이디어를 연구합니다.
  • queueName을 생성자에 제공해야합니다. 원하지 않으면 동적으로 큐를 할당해야합니다.
  • 다른 방법으로 필요할 때마다 메시지 대기열의 로컬 인스턴스를 만들 수 있지만 좋은 생각은 아닙니다. 디자인에 따라 결정해야합니다. 메시지의 크기가 int 인 이유는 무엇입니까? (100)
  • int mode이 나쁜 선택은 또한처럼
  • 피 "마법의 숫자", 즉이이 뜻입니다 무엇을 대신하는 경우 열거를 사용합니다.
  • -1 (다른 마법 번호) 만 반환하려면 예외를 catch하지 마십시오. 오류 코드는 잘못되었습니다. 실제로 처리하지 않으면 예외가 발생합니다.
  • 다음 번에 들여 쓰기를 올바르게 작성하십시오. 결국, 사람들은 그것을 읽기를 원한다, 그렇지?
+0

귀하의 방대한 해결책에 대해 Ulrich에게 고맙습니다. – cris1967

+0

울리히를 철저히 조사해 주셔서 감사합니다. 노트 주셔서 감사합니다. 제가 첨부 한 코드 조각은 제가 작업중인 코드와 비슷한 간단한 샘플입니다. 속도를 높이기 위해 나는 마술 숫자와 다른 부정확 함을 넣었습니다. 어쨌든 당신의 관찰은 절대적으로 옳습니다. 내가 충분히 명성이 없기 때문에 투표를 할 수없는 것 같습니다. – cris1967

+0

@ cris1967 평판을 얻기 위해 질문을 개선하려고 할 수 있습니다. 그러나 귀하의 질문에 대한 답변을 수락하면 항상 작동해야합니다 (그래서 당신은 또 다른 2 점을 얻습니다). – Wolf