标题仅在包含在标题中但不在cpp文件

时间:2017-11-20 12:50:36

标签: c++ compiler-errors include declaration eigen

我有一些来自library的头文件,如果我将它们包含在我的.h文件中,则会产生一些错误(见下文)。但是,如果我在我的.cpp或.hpp文件中包含这些标头,一切都会很好地编译。这背后的原因是什么?在这种特定情况下,在头文件和cpp文件中包含文件有什么不同?

在我试图包含的库中,建议的模式是您在cpp文件中有一个应用程序,其中包含标题。所以我不确定我是在重新定义事物还是创建一些循环包含。

这是我的头文件:

#ifndef MYHEADER_H
#define MYHEADER_H
#include "myLibrary.h"
#include <stdint.h>
#include <vector>


class myClass{
private:

    std::vector<myLibrary::type> var1;

public:
    myLibrary::type2 var2;

    void method1();
    void method2();    
};

#endif //MYHEADER_H

.cpp文件:

#include "myheader.h"
void myClass::method1(){...}
void myClass::method2(){...}

如果我像这样做一个hpp或cpp文件,一切都很好:

#include "myLibrary.h"
#include <stdint.h>
#include <vector>


class myClass{
private:

    std::vector<myLibrary::type> var1;

public:
    myLibrary::type2 var2;

    void method1();
    void method2();    
};

void myClass::method1(){...}
void myClass::method2(){...}

在CMake中我使用命令add_library从我的代码中创建一个库,其中包含以下行,这会导致错误:

add_library(target myheader.cpp myheader.h)

我知道我应该提供更多信息,但我对这种情况下的表现感到失望。这是错误的一部分,以防它有用。当我谷歌我看到一些与特定特征类相关的错误,所以如果是这样的话,我更感兴趣的是找到一个解决方法,而不是一个干净的修复。

/usr/local/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h:30:64: error: type/value mismatch at argument 4 in template parameter list for ‘template<class Derived, class Scalar, class OtherScalar, bool EnableIt> struct Eigen::internal::special_scalar_op_base’
                                         EigenBase<Derived> >
                                                            ^
/usr/local/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h:30:64: note:   expected a constant of type ‘bool’, got ‘Eigen::EigenBase<Derived>’
/usr/local/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h:143:94: error: type/value mismatch at argument 4 in template parameter list for ‘template<class Derived, class Scalar, class OtherScalar, bool EnableIt> struct Eigen::internal::special_scalar_op_base’
 typedef internal::special_scalar_op_base<Derived, Scalar, RealScalar, EigenBase<Derived> > Base;
                                                                                                    ^
/usr/local/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h:143:94: note:   expected a constant of type ‘bool’, got ‘Eigen::EigenBase<Derived>’
/usr/local/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h:144:11: error: ‘Base’ is not a class, namespace, or enumeration
 using Base::operator*;

我认为其余错误是由此错误引起的,并且特定于库,所以我省略了它们。

1 个答案:

答案 0 :(得分:0)

显然我在我提到的库之前包含了一些其他标题,这些标题在某些命名空间中使用了“using”语句。当我从我的标题中删除那些语句并将其移动到包含我的库标题时,所有内容都像魅力一样。