2017-03-18 3 views
2

헤더 파일이 "/ include"이고 소스 파일이 "/ src"인 ServoLink 템플릿 클래스가 있습니다. CMakeLists.txt 파일은 "include"및 "src"폴더가있는 프로젝트 디렉터리에 있습니다. 선언하고 헤더 파일의 모든 함수를 정의하기 시작했지만 실수를 빨리 깨달았고 함수 정의를 소스 파일로 넘겨 주려고합니다. 그러나 CLion은 소스 파일에서 클래스의 멤버 변수를 확인할 수 없음을 알려줍니다. CLion : 해결할 수 없음 <member_variable_name>

다음

내 CMakeLists.txt입니다 :

cmake_minimum_required(VERSION 3.6) 
project(Two_Link_Leg) 

set(CCMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror -Wextra -pedantic -pedantic-errors") 

include_directories("lib/Adafruit_PWMServoDriver") 
include_directories(include) 

set(SOURCE_FILES main.cpp src/ServoLink.cpp) 
add_executable(Two_Link_Leg ${SOURCE_FILES}) 

ServoLink.h :

#ifndef TWO_LINK_LEG_SERVOLINK_H 
#define TWO_LINK_LEG_SERVOLINK_H 

#include <map> 
#include "Adafruit_PWMServoDriver.h" 

template <class size_t> 
class ServoLink{ 

private: 

    //servo motor channel number on the PWM/Servo driver; [0, 15] 
    size_t mChannel; 

    //pointer to a map of the servo motor's angular position with its corresponding pulse width value 
    std::map<int, size_t>* mPWM; 

    //variable given by Adafruit 
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); 

public: 

    ServoLink(size_t givenChannel, size_t givenPWM[]); 
}; 

#include "../src/ServoLink.cpp" 

#endif //TWO_LINK_LEG_SERVOLINK_H 

ServoLink.cpp :

#include <stdexcept> 
#include <map> 

template<typename size_t size> 
ServoLink<size_t>::ServoLink(size_t givenChannel, size_t givenPWM[]):mChannel(givenChannel){ 
    mPWM= new std::map<int, size_t>; 
    for(size_t i= 0; i< size; i++){ 
     mPWM->insert(std::make_pair(-90+((double)180*i/size), givenPWM[i])); 
    } 
} 

내 템플릿에 어떤 구문 오류가있는 경우 코드 또는 CMakeLists.txt의 실수로, 나는 그들을 식별하는 데 도움이 될 것입니다. 고맙습니다.

+0

'ServoLink.cpp '에'ServoLink.h'를 포함하는 것을 잊었습니다. 그래서 당신은 알 수없는 유형 또는 wharever에 관한 오류를 얻습니다. – Tsyvarev

답변

1

코드에 여러 가지 문제가 있습니다. 첫째, 구조 부분. 생성자 구현을 별도의 .cpp 파일로 분할 할 필요가 없습니다. 원하는 경우 헤더에 포함 할 수도 있습니다. 헤더의 클래스 정의 안에 바로 생성자의 구현을 넣으면 괜찮을 것입니다. 구현을 클래스 정의의 외부에 배치하면이 클래스를 inline으로 표시하고 싶지만, 컴파일하지 않고 컴파일해야합니다.

CMakeLists.txt 파일에서 .cpp 파일을 add_executable()에 지정된 소스 중 하나로 지정하십시오 (실제로는 오류가 발생합니다). 컴파일러는 템플릿의 인라인 구현을 보게 될 것이고 그것에 만족할 것입니다. 이 경우 템플릿을 명시 적으로 컴파일 할 필요가 없습니다.

코드 오류가 발생했습니다. 클래스 정의의 템플릿 매개 변수가 올바르지 않습니다. 그들은해야합니다 :

또한 size_t을 보장하기 위해 #include <cstddef> 필요
template<size_t size> 
class ServoLink { 
    ... 
}; 

알려진 유형입니다. 이 말은 sizesize_t 유형의 템플릿 인수이고 원래 코드가 이름이 인 템플릿 인수를 정의하려고 시도했지만 size_t이라는 것입니다. inline는 선택 사항입니다

template<size_t size> inline 
ServoLink<size>::ServoLink(size_t givenChannel, size_t givenPWM[]) ... 

을하지만, 여러 정의 경우에 대한 몇 가지 컴파일러 경고를 침묵 수 있습니다 당신은 클래스 정의 외부 생성자 구현을 정의하려면

, 당신은 이런 식으로 그렇게 할 필요가있을 것이다 헤더를 여러 .cpp 개의 파일에 포함 시켰습니다. 해당 측면에 대한 자세한 정보는 this answer을 참조하십시오. 템플릿 인수는 유형size_t이고 이름은size입니다. 그런 다음 템플릿 이름 을 여기에 클래스 이름 뒤에으로 지정합니다.

이러한 변경 사항 (그리고 main.cpp을 추가하고 Adafruit_PWMServoDriver 헤더 및 클래스에 대한 참조를 주석으로 추가 함)는 코드가 컴파일됩니다.