我有一个非常非常奇怪的情况。 我编码的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

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

修复只是将模板函数移动到.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
}

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

  ask by Mike B translate from so

未解决问题?本站智能推荐:

2回复

C++模板类对于不同的编译器表现不同

我正在使用C ++中的模板。 使用MSVC编译器和使用Mingw gcc编译器时,使用模板和友元类是否有任何区别。 我的代码在使用MSVC编译时成功编译并提供所需的输出,但在使用gcc编译时会出错。 以下是我的代码, 编译时,上面的代码与MSVC给出了所需的输出,但是当用Mingw G
1回复

在QVector中使用指针和非指针参数的C++模板

我试图避免不得不两次使用“几乎”相同的代码。 我有以下模板函数,该函数在QVector搜索提供的值,并将索引返回到元素。 例如,搜索以下类型的矢量可以正常工作: QVector<int> ,但是我也希望能够搜索QVector<int*>类型的矢量,因此我编写了另一个
1回复

QList的C++模板

我的模板功能: 我试着打电话setIndex<>(list, selectedId); 但是这个调用会出错。 所以我试过了setIndex<QList<Item>, Item>(list, selectedId); 然后它起作用了。 我仍然不明白为什么第一个失败。
4回复

模板类C++/Qt

我有一个应用程序,它将从另一个应用程序接收消息。 这些消息将是XML fomatted字符串,它们将包含<messageType>标记。 消息类型将此消息标识为一种内部消息。 以下代码显示了我的内部消息结构。 对齐和校准是两个内部消息结构。 我想要做的是构建一个“消息解
2回复

是否可以将模板派生的C++类与Qt的Q_OBJECT混合使用?

在我的应用程序中,我有以下类层次结构: WordDictionary类解析需要很长时间的字典。 我正在一个单独的线程中运行解析函数,我希望它能够不时地通知GUI线程,以根据正在解析的当前行号提供进度更新。 这就是我希望它成为Q_OBJECT的原因。 我试图使基类Dictionary成为
3回复

C++,模板和运算符<<(使用Qt框架)

我正在建立一个名为Output的小类,这意味着它可以使我的编程在编写输出方面变得轻松(例如,支持将更多类型的输出输出到stdout(例如QString)等等)。 到目前为止,这很好,它可以与QString一起使用,但是现在我想使其接受任何类型的参数。 但是在编译时,出现此错误: ma
1回复

使用qFromBigEndian编译错误

我正在尝试使用qFromBigEndian从通过udp套接字接收的字节流中读取32位int。 编译它会出现以下错误: 错误:从'uchar *'到'qint32'的转换无效 Qt文档说: T qFromBigEndian(const uchar * src) Reads a big
1回复

C++文本过滤模板库/引擎

我正在寻找一个c ++模板库,可以帮助我过滤字符串,就像正则表达式一样。 我正在使用QT Creator IDE。 例如,我有一个"11,[7,8]495???????" 模板,并且我只希望包含11个字符的字符串,以7或8开头,后跟495以及最后7个通过的其他任何字符。 谢谢。