【发布时间】:2015-06-04 20:01:02
【问题描述】:
我有一个非常非常奇怪的情况。我的代码看起来像这样:
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,尽管我怀疑它是否已链接,但安全总比抱歉好。
【问题讨论】:
-
那个近距离投票是愚蠢的,这是一个定义明确的问题。我可能不知道答案,但很清楚问题是什么。
-
我不知道对此有密切的投票。如果可以的话,我很乐意提供人们可能要求的任何额外信息——我只是不知道还能提供什么。我完全在这里不知所措。我希望我可以简单地发布代码库,但我不能。
-
我认为根本原因不是操作系统,而是编译器错误或缺少编译器选项。
-
@PhilipStuyck 这已经在两台单独的机器上进行了测试,所以我认为这不是一些数据损坏的安装问题(但它可能是,只是我认为不太可能!)你知道吗?可能导致这种情况的编译器选项?如果有一个,我可以修复它,那就太好了!
-
当然,但是在包含编译器的封闭系统上,指定操作系统版本通常足以缩小范围。