在命名空间内转发模板类的声明

时间:2014-05-12 13:59:16

标签: c++ boost

为什么这不起作用?

//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

2 个答案:

答案 0 :(得分:2)

您无法转发声明typedef。此外,您无法转发声明std类 - 您只需在这些情况下包含相关文件(<iosfwd>是一个值得注意的例外)。

所以我不认为你在这里想要实现的目标是可能的。只需将您的typedef放在标题中,并包含该标题而不是前向声明。

顺便说一句:不要堆分配矢量类成员。向量已经在内部处理堆分配。所以有这个:

class MyClass {
    IntVec myVec; // No pointer
};

使构造函数过时,因为在这种情况下初始化myVecMyClass会自动默认构造。

答案 1 :(得分:1)

因为你的typedef和类定义“相互碰撞”。除此之外,您没有为类“IntVec”指定任何默认构造函数,并且您尝试使用以下函数对其进行实例化:

 myVec = new std::IntVec;