为什么这不起作用?
//file1.hpp
#include <vector>
namespace std
{
typedef vector<int> IntVec;
}
//file2.hpp
//forward declare IntVec
namespace std {
class IntVec;
}
class MyClass {
std::IntVec* myVec;
public:
MyClass();
};
#include "file1.hpp"
//file2.cpp
MyClass::MyClass()
{
myVec = new std::IntVec;
}
Visual Studio错误与&#39; std :: IntVec&#39;重新定义,不同的基本类型;没有合适的默认构造函数。
我感兴趣的是向前声明Boost severitly logger
//i want to do this so that I don't need to include boost log headers in my headers
typedef boost::log::sources::severity_logger<SeverityLevel> MyLogger
答案 0 :(得分:2)
您无法转发声明typedef。此外,您无法转发声明std
类 - 您只需在这些情况下包含相关文件(<iosfwd>
是一个值得注意的例外)。
所以我不认为你在这里想要实现的目标是可能的。只需将您的typedef放在标题中,并包含该标题而不是前向声明。
顺便说一句:不要堆分配矢量类成员。向量已经在内部处理堆分配。所以有这个:
class MyClass {
IntVec myVec; // No pointer
};
使构造函数过时,因为在这种情况下初始化myVec
时MyClass
会自动默认构造。
答案 1 :(得分:1)
因为你的typedef和类定义“相互碰撞”。除此之外,您没有为类“IntVec”指定任何默认构造函数,并且您尝试使用以下函数对其进行实例化:
myVec = new std::IntVec;