克利翁:不能解析

问题描述:

我有一个模板类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

有许多的代码中的问题。首先是结构部分。不需要将构造函数实现拆分为单独的.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标题和类的引用),代码为我编译。