小编Dan*_*aum的帖子

`typedef typename Foo <T> :: Bar Bar'的模板声明

我在声明模板类型时遇到了很大困难,如下所示.

#include <cstdlib>
#include <iostream>

using namespace std;


template <class T>
class Foo
{
 typedef T Bar;
};

template <class T>
typedef typename Foo<T>::Bar Bar;




int main(int argc, char *argv[])
{

    Bar bar;

    Foo<int> foo;


    system("PAUSE");
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误

template declaration of `typedef typename Foo<T>::Bar Bar' 
Run Code Online (Sandbox Code Playgroud)

关于线

template <class T>
typedef typename Foo<T>::Bar Bar;
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我想避免在我的代码中写入typename Foo :: Bar.

我究竟做错了什么?

c++ templates typedef typename

23
推荐指数
3
解决办法
2万
查看次数

是否有可能在另一个语法定义中重用boost :: spirit :: qi语法?

是否可以boost::spirit:qi在另一种语法中重用语法(例如,规则)?

例如,如果我定义一个语法来解析文本行到一个持有街道地址的结构中.

   template< typename iter >
        struct address_grammar : qi::grammar< iter, address() >
   {
     ...

       qi::rule< iter, std::string() > street_name;
       qi::rule< iter, std::string() > street_number;
       qi::rule< iter, address() > address_;
   }
Run Code Online (Sandbox Code Playgroud)

我可能想在另外两个语法中重用该语法,例如,一个可能用于解析存储在文件中的地址向量.另一种重复使用可能是在更复杂的结构中,其中一个字段是此街道地址结构.

  template< typename iter >
      struct company_grammar : qi::grammar< iter, company() >
  {
     ...
     qi::rule< iter, std::string() > comp_name;
     // can I reuse the address grammar somehow here ???
     qi::rule< iter, company() > company;
  }
Run Code Online (Sandbox Code Playgroud)

我没有在一个地方定义整个语法,而是想把它分成更小的可重用块,如果它们在一个头文件中,那就好了.我的数据结构稍微复杂一些(struct中的几个字段和其他结构的列表等等)所以我不想把它放在一个语法中.

是否有可能以boost::spirit::qi这种方式重用语法?

编辑:考虑一下,我只是qi::rule在命名空间中定义s,然后从我需要的规则中汇总一个语法?

c++ boost boost-spirit boost-spirit-qi

22
推荐指数
1
解决办法
2883
查看次数

"printf"在Windows非控制台应用程序中写入的位置?

如果我选择创建一个Windows非控制台应用程序,并printf\cout在代码中实现,那么printf\cout写在哪里?它写入stdout缓冲区吗?如果是的话,无论如何都要从中读取它stdout并将其打印到某个文本文件中或者MessageBox使用文本进行读取(只是为了验证我是否正确读取了它)?

编辑::只是为了澄清我不想将输出重定向到任何地方.我想知道,printf/cout写在哪里?如果它写入某个默认缓冲区,是否有办法读取输出,只是为了验证我已经从正确的缓冲区读取了正确的输出.请不要给我重定向"stdout"的解决方案.

c c++ winapi stdout visual-c++

19
推荐指数
2
解决办法
7731
查看次数

算法找到最长的非重叠序列

我试图找到解决以下问题的最佳方法.最好的方式我的意思是不那么复杂.

作为输入,元组列表(开始,长度)如下:

[(0,5),(0,1),(1,9),(5,5),(5,7),(10,1)]
Run Code Online (Sandbox Code Playgroud)

每个元素通过其开始长度来表示序列,例如(5,7)等同于序列(5,6,7,8,9,10,11)- 以5开头的7个元素的列表.可以假设元组按start元素排序.

输出应返回表示最长连续序列的非重叠元组组合.这意味着,解决方案是范围的子集,没有重叠且没有间隙,并且是最长的 - 尽管可能不止一个.

例如,对于给定的输入,解决方案是:

[(0,5),(5,7)] 相当于 (0,1,2,3,4,5,6,7,8,9,10,11)

它是回溯解决这个问题的最佳方法吗?

我对人们可以建议的任何不同方法感兴趣.

此外,如果有人知道这个问题的正式参考或另一个类似的问题,我想得到参考.

顺便说一句 - 这不是功课.

编辑

为了避免一些错误,这是预期行为的另一个例子

对于[(0,1),(1,7),(3,20),(8,5)]正确答案的输入[(3,20)]相当于(3,4,5,...,22)长度为20.收到的一些答案[(0,1),(1,7),(8,5)]相当于(0,1,2,...,11,12)作为正确答案.但这最后的答案是不正确的,因为它比短于[(3,20)].

algorithm complexity-theory dynamic-programming backtracking

17
推荐指数
1
解决办法
3205
查看次数

如果std :: max()通过引用返回(必须),那么可能导致悬空引用吗?

考虑范例max模板函数,std::max():

// From the STL

    // TEMPLATE FUNCTION _Debug_lt
template<class _Ty1, class _Ty2> inline
    bool _Debug_lt(const _Ty1& _Left, const _Ty2& _Right,
        _Dbfile_t _File, _Dbline_t _Line)
    {   // test if _Left < _Right and operator< is strict weak ordering
        if (!(_Left < _Right))
            return (false);
        else if (_Right < _Left)
            _DEBUG_ERROR2("invalid operator<", _File, _Line);
        return (true);
    }

// intermediate #defines/templates skipped 

    // TEMPLATE FUNCTION max
template<class _Ty> inline
    const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)
    { …
Run Code Online (Sandbox Code Playgroud)

c++ templates

16
推荐指数
2
解决办法
2268
查看次数

应该是代码行的内存漏洞"printf("%s",argv [1]);" 被描述为堆栈溢出?

今天,我从Elance.com上做了一个简短的"C++技能测试".一个问题如下:

以下代码行的安全漏洞是什么:

printf("%s", argv[1]);

选项1:格式字符串

选项2:堆栈溢出 < - 这被Elance标记为正确答案

在最初几秒钟看到问题后(或自动使问题无效),用户被提供10秒钟来回答此问题.(还有另外两个明显不相关的答案,没有被Elance标记为正确答案.)

我正在寻找缓冲区溢出缓冲区溢出作为选项.

我本能地不喜欢答案堆栈溢出,因为在我10秒内我精神上使用了我认为是"Stack Overflow"标准定义:

在软件中,当堆栈指针超出堆栈限制时,会发生堆栈溢出.调用堆栈可能包含有限数量的地址空间,通常在程序开始时确定...

根据"Stack Overflow"的定义,在没有堆栈溢出的情况下完全可以实现缓冲区溢出 ; 只有当程序试图在调用程序的总堆栈分配之外写入时才会发生堆栈溢出(无论是由于缓冲区溢出,还是由于它是否是合法写入,例如为基于堆栈的变量分配内存过多而次).

我的10秒本能告诉我,"缓冲区溢出"是对上面有问题的代码行的更准确的描述 - 因为通常(根据我的经验),有足够的空字符('\0')通过RAM中的垃圾数据来填充,以避免在这种情况下实际的堆栈溢出,但实现中的缓冲区溢出似乎是合理可能的,甚至可能.(但是,这可能printf在这里读的垃圾可能会认为argc == 1,这样有没有用户提供的argv[1];如果argv[1]存在,或许可以假设很可能是调用函数还没有插入NULL的这不是在问题陈述是否.argv[1]为当下.)

因为我想象这里可能存在缓冲区溢出问题,即使没有堆栈溢出,我回答了格式字符串,因为简单地通过传递不同的格式字符串"%.8s",问题可以大部分避免,所以它看起来像一个整体更通用,因此更好,回答.

我的回答被标记为错误.正确答案标记为"Stack Overflow".

现在我想到,如果假设argv[1]存在,那么唯一可能的缓冲区溢出是堆栈溢出,在这种情况下,堆栈溢出实际上可能是正确的答案.但是,即使在这种情况下,将这称为堆栈溢出也不会被认为是奇怪的吗?缓冲区溢出是否是描述此问题的更好方法,即使假设argv[1]存在?而且,如果argv[1]存在的,是不是非常不正确地指出,问题是 …

c++ stack-overflow printf buffer-overflow language-lawyer

16
推荐指数
1
解决办法
1217
查看次数

使用JNI时如何在C++中获取Java异常的描述?

我想确定在使用JNI从C++代码调用该函数时Java函数抛出了什么异常.我有以下代码捕获Java异常:

JNIEnv * pEnv; // assume this is properly initialized
jclass javaClass; // ditto
jmethodID javaFunction; // ditto
pEnv->CallStaticVoidMethod(javaClass, javaFunction);
jthrowable exc;
if(exc = pEnv->ExceptionOccurred())
{
    pEnv->ExceptionClear();
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何在此C++代码中获取有关Java异常的描述性信息.有人可以帮忙吗?

c++ java java-native-interface

15
推荐指数
2
解决办法
9215
查看次数

xvalue和prvalue FOR NON-POD对象之间允许的使用或行为有何不同?

什么是右值,左值,x值,glvalues和prvalues?对rvalues/lvalues的分类进行了很好的概述,最近对该问题的回答之一(/sf/answers/668701631/)强调了prvalues"喜欢"旧式rvalues的观点而新的xvalues允许"左值"行为.

但是,请考虑以下代码:

class X {};
X foo() { return X(); }

int main()
{
    foo() = X(); // foo() is a prvalue that successfully appears on the lhs
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,表达式foo()是出现在左侧的prvalue,并接受赋值.

这让我思考 - "xvalues"与"prvalues"的逻辑不同,因为xvalues(它们是glvalues)可能出现在左侧,似乎被这个例子打破了.在这里,我们有一个prvalue - 这不是一个glvalue - 成功地出现在lhs并接受任务.

(注意:在POD的情况下,上面的例子不会编译,所以对于POD,xvalues和prvalues之间的区别似乎是有意义的.因此,这个问题特别针对非POD类型.)

那么,xvalue和prvalue之间的允许使用或行为的真正区别是什么,这需要将这种区别写入标准?差异的一个例子是一个很好的替代答案.

附录

Pubby的评论是正确的.prvalue的生命周期由编译器扩展,但xvalue的生命周期不是.

所以,这是一个问题的答案:

请考虑以下代码:

// ***
// Answer to question, from Pubby's comment
// ***

class X
{
public:
    X() : x(5) {}
    int x;
};

X foo() { return X(); }
X&& goo() { return …
Run Code Online (Sandbox Code Playgroud)

c++ rvalue c++11

15
推荐指数
1
解决办法
1213
查看次数

如何使用boost.format输出百分号?

如何使用Boost.Format输出百分号?

即:

boost::format msg("5% complete"); // <- how to actually output the percent sign
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ boost

14
推荐指数
1
解决办法
2765
查看次数

如何在Qt Creator中禁用版本控制功能?

我正在使用独立的版本控制管理程序(SmartGit)和Qt Creator,我宁愿不使用Qt Creator进行版本控制管理.

Qt总是提示我是否要向Git添加新文件(当我向Qt Creator项目添加新文件时),以及我是否要从Git中删除文件(当我删除时)来自项目的文件).

今天早些时候,在向Qt Creator项目添加新文件时,我错误地通过Qt Creator向Git添加了一个文件.几分钟后,我希望暂时从项目中删除该文件(稍后可能会重新添加).当我删除文件时,Qt Creator尽职地问我是否要从版本控制中删除该文件 - 向我发出警告,提示该文件可能会从文件系统中永久删除.理解风险,我仍然决定测试行为,我说"是的,从Git中删除文件以及从项目中删除它".正如预警警告一样,文件已从文件系统中删除,然后我不得不重新构建它.

除了SmartGit之外,我可以简单地使用它并偶尔使用Qt Creator的版本控制功能,和/或我可以直接使用SmartGit来处理任何错误的偶然使用ogreatf Qt Creator的版本控制功能.但是,为了方便起见,我宁愿完全禁用Qt Creator的版本控制功能.

我查看了我能找到的每个Qt Creator选项,以查看是否可以禁用Qt Creator的版本控制功能(即使项目的文件受版本控制).不幸的是,我无法在任何地方找到禁用Qt Creator版本控制功能的选项.仔细的Google搜索也没有透露任何信息.

即使项目的文件受版本控制,是否可以禁用Qt Creator的版本控制功能?如果是这样,它是如何完成的?

qt qt-creator

14
推荐指数
1
解决办法
3507
查看次数