我有一个非常非常奇怪的情况。我将sorta的代码看起来像这样:
class Foo
{
public:
template <class T>
int doSomething()
{
std::cout << "Hello world!";
// bunch of code
}
};
如果我试着像这样调用doSomething:
std::cout << "Pre";
doSomething<int>();
std::cout << "Post";
输出:
Pre
Post
我没有得到输出Hello World,并且函数中没有任何内容被执行。当然这意味着我的程序稍后会崩溃,因为我需要执行该函数。
但是,如果我做模板专业化:
template <>
int doSomething<int>()
{
std::cout << "Hello World int!";
// more code
}
然后我的输出是:
Pre
Hello World int!
Post
这不会发生在Windows或Linux上,仅在Mac上发生 - 而且只发布在旧版Mac OS上编译的版本。
标准或通用编译器实现中是否存在可能导致此行为的内容?在哪里,如果你没有专门化模板,那么模板不会被调用?
如果我在模板函数的主体中放置了格式错误的代码,编译器会为每个模板类型参数抛出一个错误,因此我确信代码正在编译中。我不明白为什么它没有被召唤。代码库中还有其他模板可以正常工作。
我会发布确切的代码,但不幸的是,由于公司政策,我不能。如果我写一些一次性代码,我似乎也无法重现!
我知道这里并不多,而且我很抱歉在没有提供真实信息的情况下提出要求,但经过大量的谷歌搜索后,我很快就会出现问题。有没有人之前遇到过这样的事情,如果有的话,他们知道到底发生了什么事吗?
编辑:编译器版本。我以为我已经写了这个,但显然没有!遗憾!
G ++ 4.2(GCC 4.2.1,基于Apply Inc. build 5658)
我在命令行中使用相同的编译器进行编译。但是,我正在使用QtCreator作为主要项目,问题源于此。我会更新这个问题,提到它使用Qt,虽然我怀疑它的关联是安全而不是抱歉。
答案 0 :(得分:0)
所以最后,我已经解决了这个问题 - 但我不知道它为什么会起作用,而正常方法却没有。
修复只是将模板函数移动到.cpp文件中定义的另一个类,其中正在使用模板函数。
HPP:
class Foo
{
int update(); // this calls the template functions
FooInternal* d;
};
CPP:
class FooInternal
{
template <class T>
int doSomething()
{
std::cout << "Hello world!";
// some code
}
};
int Foo::update()
{
d->doSomething<int>();
// more code
}
这真的很奇怪,因为这个文件只包含在一个地方,并且代码从未被调用到类之外。不明白。