标签: c++03

为什么auto的旧用法(c ++ 03)不能在C++ 11下编译?

我知道auto之前有一些用法,因为它是变量的默认值(与静态相反) - 请参阅问题 考虑有效的C++ 03代码,其中可能为了不言自明,使用了这个关键字:

auto int foo2 = 8;
Run Code Online (Sandbox Code Playgroud)

它在C++ 03下编译,不能在C++ 11下编译.有没有理由不与C++ 03反向兼容?标准委员会意见的来源是什么,没有使用此关键字?是否有关键字使用情况的统计数据?

BTW我用gcc测试过 - 也许这是一个编译器错误?

c++ auto c++11 c++03

4
推荐指数
2
解决办法
1143
查看次数

模板参数为零时阻止模板实例化

我有一个模板课

template< std::size_t Size >
class Buffer
{
....
};
Run Code Online (Sandbox Code Playgroud)

当Size参数为零时,我想阻止此模板的实例化.即为以下内容生成编译器警告.

Buffer< 0 > buf;
Run Code Online (Sandbox Code Playgroud)

但所有其他变种都可行.

Buffer< 10 > buf;
Run Code Online (Sandbox Code Playgroud)

我正在寻找使用boost :: enable_if_c,但我不明白如何让它工作.

- 更新 - 遗憾的是,我无法使用任何c ++ 11功能

c++ templates boost c++03

4
推荐指数
3
解决办法
238
查看次数

转发声明一个typedef

我有一个大的头文件(~10000行),由我的控件中的脚本/程序自动生成.

为了避免在我的类的声明中包含此文件,我转发声明我需要的几种类型:

--myclass.h

namespace bl {
   class TypeA;
   class TypeB;
}
// Other stuff and myclass definition...
Run Code Online (Sandbox Code Playgroud)

现在它证明了TypeA并且TypeB不是类名,而是在自动生成的文件中定义为:

typedef SomeUnspecifiedClassName TypeA;
typedef AnotherUnspecifiedClassName TypeB;
Run Code Online (Sandbox Code Playgroud)

在哪里SomeUnspecifiedClassName我的意思是我不能转发声明这个类型名称,因为它可能会在各种情况下发生变化.

我怎样才能转发声明typedef?(不能使用c ++ 11)

c++ forward-declaration c++03

4
推荐指数
1
解决办法
3981
查看次数

如何创建模板依赖成员类型

我试图减少并简化一些可怕的嵌套和过度专业的模板化C++代码.为此,我希望能够声明成员类型,该成员类型取决于函数或类已实例化的模板化类型.

获取以下通用类模板生成的模板特化.'a'的类型取决于实例化类型.

  template <typename Float> class A;

  template <>
    class A<double> {  
      double a;
    }
  };

  template <>
    class A<float> {  
      float a;
    }
  };


  template <>
    class A<short> {  
      float a;
    }
  };
Run Code Online (Sandbox Code Playgroud)

除了'a'的类型,模板类型到double-> double的类型,float-> float和short-> float之外,这些类是相同的.有没有办法简单地封装这个映射,只允许只写一次类?

我想我想写下面的内容,但我不知道这是否可行.

  typedef double Float2<double>;
  typedef float Float2<float>;
  typedef float Float2<short>;

  template <typename Float>
    class A {  
      Float2<Float> a;
    }
  };
Run Code Online (Sandbox Code Playgroud)

注意我正在使用C++ 03并且不能使用C++ 11来实现此目的(我认为decltype可能在这里使用,但我不确定).

c++ templates c++03

4
推荐指数
1
解决办法
287
查看次数

我什么时候应该在C++中使用引用?

我一直在编写C++编程,我开始怀疑规则使用引用应尽可能应用于任何地方.

这个相关的SO帖子不同,我对一种不同的东西感兴趣.

根据我的经验,参考/指针混合会混淆你的代码:

std::vector<Foo *> &x = get_from_somewhere(); // OK? reference as return value
some_func_pass_by_ref(x); // OK reference argument and reference variable
some_func_by_pointer(x[4]); // OK pointer arg, pointer value
some_func_pass_elem_by_ref(*x[5]); // BAD: pointer value, reference argument
some_func_that_requires_vec_ptr(&x); // BAD: reference value, pointer argument
Run Code Online (Sandbox Code Playgroud)

一种选择是,以取代&* constFoo &Foo * const

void some_func_by_ref(const std::vector<Foo * const> * const); // BAD: verbose!
Run Code Online (Sandbox Code Playgroud)

这样至少走遍了.和我重写功能头走了,因为所有的参数将指针......在污染代码的价格const,而不是指针运算(主要是&*).

我想知道在可能的规则下如何 …

c++ pointers c++03

4
推荐指数
1
解决办法
461
查看次数

在这个尝试C++ 03的`std :: future`实现时,互斥锁出了什么问题?

我正在尝试调整Martinho Fernandes的示例std::future实现,以便它可以在C++ 03下以Boost 1.40运行,作为一种便宜的,间隙测量,直到我可以访问Boost 1.41或C++ 11本身.

我的适应性并不美观,而且肯定不是最佳的,但我更希望它至少能起作用.但是,根据gcc版本4.4.1 20090725(Red Hat 4.4.1-2),它没有.

这是futures.h:

#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <stdexcept>

template <typename T>
class future;

template <typename T>
class promise;

namespace detail {

    template <typename T>
    struct future_shared_state
    {
    public:

        void wait(boost::mutex& m) const
        {
            boost::mutex::scoped_lock lock(m, boost::adopt_lock);
            while (!(state || error))
                available.wait(lock);
        }

        T& get()
        {
            if (state)
                return *state;

            if (error)
                throw *error;

            throw std::runtime_error("WTF");
        }

        template <typename U>
        void set_value(const U& value) …
Run Code Online (Sandbox Code Playgroud)

c++ boost future boost-thread c++03

4
推荐指数
1
解决办法
694
查看次数

在编译时执行常量和重新解释转换吗?

我读过static_cast在编译时dynamic_cast发生并且在运行时发生,因此比它慢static_cast.A dynamic_cast可以返回null ptr(当使用指针时)或者抛出错误的强制转换异常.我的问题是关于什么reinterpret_castconst_cast做他们发生在编译时或运行时?我认为解释强制转换是在运行时发生的,因为它的行为类似于dynamic_cast指示强制转换是否成功.我对么 ?const_cast是编译时间吗?

c++ casting c++03

4
推荐指数
1
解决办法
2733
查看次数

由于无符号,在模板化方法中删除警告

我找到了一些模板化的代码,在某些时候执行以下检查:

template<class IntegralType>
void randomFunction(IntegralType t)
{
    ...
    if (t < 0)
    ...
}
Run Code Online (Sandbox Code Playgroud)

代码的概念t是整数类型(有符号或无符号).无论签名如何,代码都可以正常工作,但编译器会发出警告,因为在unsigned整数的情况下,检查将始终为true.

在C++ 03中有没有办法修改代码以摆脱警告而不抑制它?我正在考虑T以某种方式检查签名,不知道它是否可能.

我知道C++ 11,is_signed但我不确定它是如何在C++ 03中实现的.

c++ templates compiler-warnings c++03

4
推荐指数
1
解决办法
136
查看次数

在命名空间c ++中正确声明extern变量

我有一些const变量,我希望在多个源文件之间共享值.我还希望变量的范围限于命名空间.我不确定最好/正确的方法吗?

我可以使用#define但希望类型安全.

到目前为止,我有以下工作:

File0.h

#pragma once

namespace Namespace1
{
   extern const int variable1;
   extern const int variable2;
}
Run Code Online (Sandbox Code Playgroud)

File0.cpp

const int Namespace1::variable1 = 10;
const int Namespace1::variable2 = 10;
Run Code Online (Sandbox Code Playgroud)

Source1.cpp

#include "File0.h"
int result1 = Namespace1::variable1 + Namespace1::variable2;
Run Code Online (Sandbox Code Playgroud)

Source2.cpp

#include "File0.h"
const int result2 = Namespace1::variable1 + Namespace1::variable2;
Run Code Online (Sandbox Code Playgroud)

使用extern我如何知道值何时初始化?

c++ c++03

4
推荐指数
1
解决办法
272
查看次数

如何声明恒定的方法指针

1 ST关断这不是关于如何指向一个恒定方法问题。我想知道如何使我的方法指针恒定。

鉴于:

struct foo {
    void func1();
    void func2();
};
Run Code Online (Sandbox Code Playgroud)

我可以使用构建方法指针,void (foo::*bar)() = &foo::func1 但是以后可以使用,bar = &foo.func2我想避免这种情况。

我可以轻松地做到这一点const auto bar = &foo::func1,但是我不确定在之前如何做到这一点。

c++ member-function-pointers function-pointers constants c++03

4
推荐指数
1
解决办法
58
查看次数