【发布时间】:2012-01-06 12:15:03
【问题描述】:
这段代码有什么问题:
标题:
#include <map>
using namespace std;
template<class T>
class ValueCollection
{
public:
ValueCollection(void);
int getValueCount(void);
map<string, T> Values;
};
实施:
#include "ValueCollection.h"
ValueCollection<class T>::ValueCollection(void)
{
}
int ValueCollection<class T>::getValueCount(void)
{
return Values.size();
}
测试:
#include "ValueCollection.h"
TEST(ValueCollection_TestCases, Default_Constructor_MapIsEmpty)
{
ValueCollection<int>* target = new ValueCollection<int>;
int expected = 0;
int actual = target->getValueCount();
ASSERT_EQ(expected, actual);
}
这是错误:
Error 1 error C2079: 'std::_Pair_base<_Ty1,_Ty2>::second' uses undefined class 'T' c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility 167 1 Refactor01
【问题讨论】:
-
您是否曾在任何时候加入过
<string>? -
很多事情都错了。简短的回答:您不能将定义与模板的声明分开。
-
请永远不要在头文件中说
using namespace std;。 -
添加
typename,如`mapValues;`? -
@KerrekSB:我并不是在抨击
using本身,而是在使用别名时直接注入名称的想法同样有效(至少在命名空间级别)。在 C++11 中,这是别名。