克利翁:不能解析
我有一个模板类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错误,我将不胜感激任何帮助,以识别它们。谢谢。
有许多的代码中的问题。首先是结构部分。不需要将构造函数实现拆分为单独的.cpp
文件,如果需要,也可以将其包含在标题中。如果你把构造函数的实现放在标题中的类定义里面,那就没问题了。如果你把这个实现放在类定义之外,你可能想把它标记为inline
,但是它应该仍然没有编译。
您不需要(并且实际上会得到一个错误,如果您这样做)将.cpp
文件指定为您的CMakeLists.txt文件中add_executable()
的源之一。编译器会看到模板的内联实现,并对此感到满意。在这种情况下,不需要显式地尝试编译模板。
我们的代码中的错误。类定义的模板参数不正确。他们应该是:
template<size_t size>
class ServoLink {
...
};
您还需要#include <cstddef>
确保size_t
是一个已知的类型。它说的是,size
是size_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
标题和类的引用),代码为我编译。
你忘了在ServoLink.cpp中包含ServoLink.h'。这就是为什么你得到关于未知类型或混乱的错误。 – Tsyvarev