编译但未使用的C ++模板 - mac OS Lion

时间:2015-03-31 13:02:32

标签: c++ macos qt templates

我有一个非常非常奇怪的情况。我将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,虽然我怀疑它的关联是安全而不是抱歉。

1 个答案:

答案 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
}

这真的很奇怪,因为这个文件只包含在一个地方,并且代码从未被调用到类之外。不明白。