2017-03-18 45 views
2

我有一個模板類SERVOLINK其標題文件是「/包括」和它的源文件是「/ SRC」。 CMakeLists.txt文件位於項目目錄中,其中包含「include」和「src」文件夾。我開始聲明和定義頭文件中的所有函數,但是我很快意識到自己的錯誤,並且試圖將函數定義轉移到源文件中。但是,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'。這就是爲什麼你得到關於未知類型或混亂的錯誤。 – Tsyvarev

回答

1

有許多的代碼中的問題。首先是結構部分。不需要將構造函數實現拆分爲單獨的.cpp文件,如果需要,也可以將其包含在標題中。如果你把構造函數的實現放在標題中的類定義裏面,那就沒問題了。如果你把這個實現放在類定義之外,你可能想把它標記爲inline,但是它應該仍然沒有編譯。

您不需要(並且實際上會得到一個錯誤,如果您這樣做)將.cpp文件指定爲您的CMakeLists.txt文件中add_executable()的源之一。編譯器會看到模板的內聯實現,並對此感到滿意。在這種情況下,不需要顯式地嘗試編譯模板。

我們的代碼中的錯誤。類定義的模板參數不正確。他們應該是:

template<size_t size> 
class ServoLink { 
    ... 
}; 

您還需要#include <cstddef>確保size_t是一個已知的類型。它說的是,sizesize_t類型的模板參數,而你的原代碼試圖定義模板參數,其size_t

如果你要定義類定義之外的構造函數實現,你需要做的這麼像這樣:

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

inline是可選的,但是沉默的警告有關多個定義,如果一些編譯器您將頭文件包含在多個.cpp文件中。有關此方面的更多信息,請參閱this answer。模板參數是類型size_t並具有size。然後在此處輸入名稱後面的模板參數名稱

隨着這些變化(並且組成一個簡單的main.cpp加上註釋掉對Adafruit_PWMServoDriver標題和類的引用),代碼爲我編譯。