【问题标题】:C++ template compiled but not used - mac OS LionC++ 模板已编译但未使用 - mac OS Lion
【发布时间】: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 这已经在两台单独的机器上进行了测试,所以我认为这不是一些数据损坏的安装问题(但它可能是,只是我认为不太可能!)你知道吗?可能导致这种情况的编译器选项?如果有一个,我可以修复它,那就太好了!
  • 当然,但是在包含编译器的封闭系统上,指定操作系统版本通常足以缩小范围。

标签: c++ macos qt templates


【解决方案1】:

所以最后,我已经解决了这个问题——但我不知道为什么它会起作用,而正常的方法不起作用。

解决方法只是将模板函数移动到在 .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
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2013-04-21
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多