首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决gcc-3.4的错误(也许这不是一个bug)?

如何解决gcc-3.4的错误(也许这不是一个bug)?
EN

Stack Overflow用户
提问于 2010-03-02 06:59:05
回答 3查看 386关注 0票数 2

下面的代码与错误消息一起失败:

代码语言:javascript
复制
t.cpp: In function `void test()':
t.cpp:35: error: expected primary-expression before '>' token
t.cpp:35: error: expected primary-expression before ')' token

现在我看不出代码有什么问题,它是用gcc-4.x和MSVC 2005编译的,而没有编译gcc-3.4 (在某些平台上仍然很流行)。

代码语言:javascript
复制
#include <string>
#include <iostream>

struct message {
        message(std::string s) : s_(s) {}
        template<typename CharType>
        std::basic_string<CharType> str()
        {
                return std::basic_string<CharType>(s_.begin(),s_.end());
        }
private:
        std::string s_;
};


inline message translate(std::string const &s)
{
        return message(s);
}


template<typename TheChar>
void test()
{
        std::string s="text";
        std::basic_string<TheChar> t1,t2,t3,t4,t5;

        t1=translate(s).str<TheChar>(); // ok

        char const *tmp=s.c_str();
        t2=translate(tmp).str<TheChar>(); // ok

        t3=message(s.c_str()).str<TheChar>(); // ok

        t4=translate(s.c_str()).str<TheChar>(); // fails

        t5=translate(s.c_str()).template str<TheChar>(); // ok

        std::cout << t1 <<" " << t2 <<" " << t3 << " " << t4 << std::endl;
}

int main()
{
        test<char>();
}

是否有可能在translate函数和message类级别上解决这个问题,或者我的代码是错误的,如果是的话,在哪里呢?

编辑:

GCC 3.4.6中与模板相关的Bugs说我需要使用关键字template,但我应该使用吗?

这是个虫子吗?我必须写一个template关键字吗?因为在所有其他情况下我不需要这么做?而且它是相当有线的,当我使用".c_str()“成员函数时,我不必写它。

为什么gcc-4并不总是一个选项

此程序在使用Cygwin下的gcc-4编译时不会启动。

代码语言:javascript
复制
#include <iostream>
#include <locale>

class bar : public std::locale::facet  {
public:
        bar(size_t refs=0) : std::locale::facet(refs)
        {
        }
        static std::locale::id id;
};

std::locale::id bar::id;


using namespace std;

int main()
{
        std::locale l=std::locale(std::locale(),new bar());
        std::cout << has_facet<bar>(l) << std::endl;
        return 0;
}

这段代码不编译gcc-4.3下的OpenSolaris 2009-坏概念检查.

代码语言:javascript
复制
#include <map>
struct tree {
   std::map<int,tree> left,right;
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-02 10:37:17

正如其他地方所提到的,这似乎是一个编译器错误。很公平;它们是存在的。下面是你要做的事情:

代码语言:javascript
复制
#if defined(__GNUC__) && __GNUC__ < 4
// Use erroneous syntax hack to work around a compiler bug.
t4=translate(s.c_str()).template str<TheChar>();
#else
t4=translate(s.c_str()).str<TheChar>();
#endif

GCC总是将__GNUC__定义为主要的编译器版本号。如果需要,还可以得到x.y.z版本号的y和z的__GNUC_MINOR____GNUC_PATCHLEVEL__

票数 2
EN

Stack Overflow用户

发布于 2010-03-02 08:24:46

这是旧编译器中的一个bug。较新的GCC,从4.0到(尚未发行) 4.5,接受它,他们应该。这是标准的C++。(英特尔和科莫也接受这一点。)

当然,关于cygwin和opensolaris,gcc-3.4并不是唯一的选择:更新版本(发布的4.4.3或未发布的4.5分支)在这些操作系统上工作得很好。对于cygwin,它是官方发行版的一部分(请参阅gcc4* packages 在名单中)。对于opensolaris,您可以自己编译它(关于如何这样做的说明可以很容易地在Google中找到)。

票数 2
EN

Stack Overflow用户

发布于 2010-03-02 08:29:34

我会尝试使用不同的解决方法,因为添加template消歧器是不正确的,如果您稍后转到不同的编译器,就会中断。

我不知道真正的代码,但是传递一个常规的std::string似乎是有效的(选项1:避免转换到const char *仅仅是为了创建一个临时的),或者您可以提供一个重载的translate,它使用const char*作为参数(如果编译器没有在那里抱怨的话),这取决于您的需求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2361388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档