只有包含在标头中而不包含在cpp文件中时,标头才会抛出错误
Header throws error only when included in header but not in cpp file
我有一些库中的头文件,如果我将它们包含在.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*;
我认为其余的错误都是由这个错误引起的,并且是库特有的,所以我省略了它们。
显然,在我提到的库之前,我包含了一些其他的头,这些头对一些名称空间使用了"using"语句。当我从我的头中删除这些语句,并将include移到库头的include下时,一切都像一个符咒。
相关文章:
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 猫鼬 - 包含标准C++库文件时出错
- 编译包含LLVM API标头的C++文件时出错
- 在Windows上设置CMake和vcpkg时出错"无法打开包含文件"
- 包含可可标头时出错
- 如何包含QwebEngineView而不会出错
- 包含适当的标头时,实现文件中的多个定义出错
- 在 C++ 中包含库数据库.txt文件时出错
- ctime 包含 boost::文件系统时出错
- 当我包含 DirectXTex.h 时出错
- 编译包含 CPLEX 工具的项目时出错
- 在 Cygwin 64 上包含 boost.asio 时出错
- 使用 Qt 标头的递归包含时出错
- 将 Boost 标头包含在 .h 文件中但不包含在.cpp文件中时出错
- 当类包含boost::container::flat_set时,复制对象时出错
- 当我在 c++ 中不包含字符串头文件时出错
- 包含预编译头时出错
- 在c++项目中包含dlib库时出错
- 分配包含另一个结构数组的结构数组时出错