###-g++时出错:undefined reference to

pcwl 2003-12-10 11:07:48
mainOne.cpp: undefined reference to `NewHandlerSupport<TestNewSupport>::s_currHandler'
这是为什么?
我的程序结构:
template<class T>
class NewHandlerSupport
{...}
class TestNewSupport : public NewHandlerSupport<TestNewSupport>
{...}

mainOne.cpp 中用到,就出上面的错误。
...全文
610 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pcwl 2003-12-12
没人回答了???
回复
pcwl 2003-12-12
谢谢fierygnu(va_list),谢谢大家,到此为止,结帖!
回复
fierygnu 2003-12-12
派生类就是(is a)基类,所以这些类共有同样的static成员变量。
模板是已参数为类型,不同的参数生成的是不同的类,这些类之间没有关系,所以必须每个实例化的类都有一个静态成员变量的实例。注意我给的不是TestNewSupport::s_currHandler,而是NewHandlerSupport<TestNewSupport>::s_currHandler,这是TestNewSupport的基类。
回复
pcwl 2003-12-11
mainOne.cpp

#include <iostream>
#include "TestNewSupport.h"

using namespace std;
void testNewSupport();

int main(int argc,char* argv[])
{
testNewSupport();
return 0;
}
/*
* new handler
*/
void newHandler()
{
cout << "in newHandler" << endl;
}

/*
* test new handler support template
*/
void testNewSupport()
{
TestNewSupport::set_new_handler(newHandler);
TestNewSupport* pNewSupport = new TestNewSupport();
delete pNewSupport;
}
回复
pcwl 2003-12-11
TestNewSupport.h

#include "NewHandlerSupport.h"

class TestNewSupport : public NewHandlerSupport<TestNewSupport>
{
public:

TestNewSupport(){}
~TestNewSupport(){}
};
回复
pcwl 2003-12-11
NewHandlerSupport.h :
#ifndef NEW_HANDLER_SUPPORT
#define NEW_HANDLER_SUPPORT

#include <new>
#include <iostream>

template<class T>
class NewHandlerSupport
{
public:

NewHandlerSupport(){}
virtual ~NewHandlerSupport(){}

static std::new_handler set_new_handler(std::new_handler p)
{
std::cout << "in set_new_handler" << endl;

std::new_handler oldHandler = s_currHandler;
s_currHandler = p;
return oldHandler;
}
static void* operator new(size_t size)
{
std::cout << "in operator new" << endl;

std::new_handler globalHandler = std::set_new_handler(s_currHandler);

void* memory = NULL;
try
{
memory = ::operator new(size);
}
catch(std::bad_alloc&)
{
set_new_handler(globalHandler);
throw;
}
set_new_handler(globalHandler);
return memory;
}

private:
static std::new_handler s_currHandler;
};

#endif

NewHandlerSupport.cpp :
#include "NewHandlerSupport.h"

template<class T>
std::new_handler NewHandlerSupport<T>::s_currHandler = NULL;
回复
pcwl 2003-12-11
to fierygnu(va_list):不是吧,static 成员是类成员,每个类只有一个,不管这个类产生多少个实例。
上面的代码是我抄effective c++写的,我觉得作者的用template作为base的主要用意是为每个子类产生一个不同的static 成员 s_currHandler,如果不用template的话,不管有多少个子类都只会有一个s_currHandler,因为template类的类代码是compile的时候compliler为我们产生的(当有实例化对象时)。
这是我的认为。
回复
fierygnu 2003-12-11
不是派生类的要求,是模板实例化的要求。派生类使用的是基类的静态成员变量。对每个实例化的类都需要定义一个。
回复
pcwl 2003-12-11
谢谢fierygnu(va_list),谢谢大家,再问一下:对于template来说,是不是对于每个子类都产生一个不同的std::new_handler NewHandlerSupport<TestNewSupport>::s_currHandler = NULL;成员,而这个成员的定义是不是应该把它放在子类里定义,那父类(template的)是不是不用定义这个成员。
回复
fierygnu 2003-12-11
不能用模板,需要自己定义:
std::new_handler NewHandlerSupport<TestNewSupport>::s_currHandler = NULL;
回复
pcwl 2003-12-11
我有定义,代码在上面,(就是试一下effective c++书上的代码).大家帮忙看一下,好像是template的问题?
回复
短歌如风 2003-12-11
oopig说对了。应该是缺少静态成员的定义。
回复
sunnyasp 2003-12-11
顺便问一下:
如果只一个a.h文件,那我用g++ -c a.h好像不行,它说要有.cpp,这种应该怎么用,
还有csdn怎么会限制回复数的(3次以下),不合理,下面两个回复我还是用朋友的帐号。
回复
sunnyasp 2003-12-11
makefile:
all : mainOne.o NewHandlerSupport.o TestNewSupport.o
g++ -o mainOne mainOne.o NewHandlerSupport.o TestNewSupport.o -L D:/MinGW/lib/gcc-lib/mingw32/3.2.3/ -lstdc++
mainOne : NewHandlerSupport.h NewHandlerSupport.cpp TestNewSupport.h mainOne.cpp
g++ -c mainOne.cpp
TestNewSupport.o : NewHandlerSupport.h TestNewSupport.h TestNewSupport.cpp
g++ -c TestNewSupport.cpp
NewHandlerSupport.o : NewHandlerSupport.h NewHandlerSupport.cpp
g++ -c NewHandlerSupport.cpp
回复
短歌如风 2003-12-10
没有问题啊。不过在NewHandlerSupport中不能用
T x这样的声明,只能用T * x,因为这时TestNewSupport还没有完整定义。
把你的类定义贴上来。
回复
oopig 2003-12-10
要在NewHandlerSupport的特化实例所在的cpp中加上s_currHandler的定义,例如:
Class *NewHandlerSupport<TestNewSupport>::s_currHandler = 0;
回复
michaelli 2003-12-10
指针有问题,可能没有初始化,
回复
发动态
发帖子
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
社区公告
暂无公告