标签: c++

为什么qmake将所有对象(.o)文件放在一个目录中?

假设我有一个Qt应用程序,我在两个不同的命名空间中有两个具有相同名称的类:

namespace namespace1
{
    class SomeClass;
}

namespace namespace2
{
    class SomeClass;
}
Run Code Online (Sandbox Code Playgroud)

我根据它有一个项目目录结构:

-->src/
  -->namespace1/
    -->someclass.cpp
  -->namespace2/
    -->someclass.cpp
Run Code Online (Sandbox Code Playgroud)

当我使用qmake编译应用程序时,它将所有对象(.o)文件放在一个目录中 - 所以它首先创建someclass.o文件然后用第二个someclass.o重写它- 这是一个名称冲突所以它很糟糕.

为什么qmake没有考虑源文件的目录结构?为什么它不会创建像namespace1_someclass.onamespace2_someclass.o这样的东西?

是的,我可以将我的类放到一个目录中,并将它们命名为namespace1_someclass.cppnamespace2_someclass.cpp,并且不会发生名称冲突,但这会在查看Qt Creator中项目资源管理器中的源文件时造成很少的不便,因为当有在项目中有很多源文件,它的可读性远远低于我可以展开或折叠的目录结构.

另一个极端是拥有如下目录结构:

-->src/
  -->namespace1/
    -->namespace1_someclass.cpp
  -->namespace2/
    -->namespace2_someclass.cpp
Run Code Online (Sandbox Code Playgroud)

它解决了名称冲突,但它冗余地复制了命名空间名称 - 因此再次不太可读.

为什么qmake至少没有根据源文件将目标文件放到目录结构中的选项?Qt的创造者不知道这是一个重要的特征吗?

还有一件事 - 你可以建议我使用cmake工具而不是qmake,但是我发现使用cmake 要比qmake 困难得多,而qmake到目前为止它的工作非常出色 - 除了对象文件的放置.

c++ qt qmake

24
推荐指数
2
解决办法
3961
查看次数

QString优于std :: string的优点

QString比std :: string有什么优势?普通的std :: string可以存储unicode字符吗?我正在尝试编写一个可以打开各种歌曲文件的程序.这些文件的名称可以使用不同的语言.我听说在这种情况下使用普通字符串将无法正常工作.我想保持应用程序独立于QT并重用代码,例如在android中.你有什么建议

c++ string unicode qt qt-creator

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

map operator []和bool作为值

我们知道如果我们尝试使用std::mapoperator [] 访问不存在的键,该函数将使用该键插入一个新元素.

我们有: std::map<std::string, bool> map_xxx;

是否保证在访问不存在的密钥后map_xxx["nonexistent_key"],第二个参数的值将始终为false

PS.如果没有,任何想法如何有这种行为?

c++ stl map

24
推荐指数
1
解决办法
7865
查看次数

防止用户从错误的CRTP基础派生

我无法想出一个适当的问题标题来描述问题.希望下面的细节清楚地解释了我的问题.

请考虑以下代码

#include <iostream>

template <typename Derived>
class Base
{
    public :

    void call ()
    {
        static_cast<Derived *>(this)->call_impl();
    }
};

class D1 : public Base<D1>
{
    public :

    void call_impl ()
    {
        data_ = 100;
        std::cout << data_ << std::endl;
    }

    private :

    int data_;
};

class D2 : public Base<D1> // This is wrong by intension
{
    public :

    void call_impl ()
    {
        std::cout << data_ << std::endl;
    }

    private :

    int data_;
};

int main ()
{
    D2 …
Run Code Online (Sandbox Code Playgroud)

c++ crtp

24
推荐指数
2
解决办法
2159
查看次数

禁用g ++"note candidate are .."编译器消息

很多时候,当我使用拼写错误或其他类型的输入不匹配来编译某些东西时,我得到了标准的"错误:在...中没有匹配'functionname'"错误.这很棒.然后,特别是在重载函数和运算符的情况下,g ++继续并列出10页的候选者,这些页面只是可怕的和大量的模板定义.

错误消息很棒,但有没有办法禁止它建议其他功能变体?

c++ g++

24
推荐指数
3
解决办法
8820
查看次数

在类构造函数中设置std :: vector

我正在设计一个具有std::vector<int>实例变量的类.我正在使用a,std::vector因为我需要在运行时设置它的大小.以下是我的代码的相关部分:

my_class.h:

#include <vector>
using std::vector;
class MyClass {
    int size;
    vector<int> vec;
}

my_class.cc:

#include "my_class.h"
using std::vector
MyClass::MyClass(int m_size) : size(m_size) {
     vec = new vector<int>(size,0);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我收到以下错误消息:

g++ -c -Wall my_class.cc -o my_class.o

my_class.cc: In constructor ‘MyClass::MyClass(int):

  my_class.cc:4 error: no match for ‘operator=’ in ‘((MyClass*)this)->My_Class::vec = ((*(const allocator_type*)(& std::allocator<int>())), (operator new(24u), (<statement>, ((std::vector<int>*)<anonymous>))))’

make: *** [my_class.o] Error 1
Run Code Online (Sandbox Code Playgroud)

但是,当我将违规行更改为:

vector<int> temp(size,0);
vec = temp;
Run Code Online (Sandbox Code Playgroud)

它现在编译没有故障,我得到了所需的行为,并可以访问我的矢量

vec[i]  // i having been defined as an …
Run Code Online (Sandbox Code Playgroud)

c++ constructor new-operator stdvector

24
推荐指数
2
解决办法
7万
查看次数

为什么`is_open()`非const?

我有一个类似于下面的函数,它是const,需要在继续之前检查文件流是否打开:

bool MyClass::checkSomeStuff() const
{
    // Where outputFile_ is a std::ofstream
    if ( ! outputFile_.is_open() )
    {
        throw std::runtime_error( "Output file not open." );
    }

    // ... do more stuff
Run Code Online (Sandbox Code Playgroud)

但是,似乎我不能这样做,因为is_open()声明为:

bool is_open ( );
Run Code Online (Sandbox Code Playgroud)

(即非常数)

对我来说,像这样的函数 - 显然是一个纯粹的访问器 - 似乎有点奇怪 - 应该是非常量的.背后的逻辑是否合理?

c++ ofstream

24
推荐指数
2
解决办法
651
查看次数

transform_primary()和collat​​e_byname()

为了给出我正在讨论的内容,下面的程序true在使用clang ++/libc ++编译时正确打印

#include <iostream>
#include <regex>
int main()
{
    std::locale::global(std::locale("en_US.UTF-8"));
    std::wstring str = L"AÀÁÂÃÄÅaàáâãäå";
    std::wregex re(L"[[=a=]]*", std::regex::basic);
    std::cout << std::boolalpha << std::regex_match(str, re) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

但是,我不太明白std::regex_traits::transform_primary()标准中的描述(通过它[=a=]来处理).引用28.7 [re.traits]/7:

if typeid(use_facet<collate<charT> >) == typeid(collate_byname<charT>)和返回的sort键的形式collate_byname<charT>::transform(first, last)是已知的并且可以转换为主排序键然后返回该键,否则返回一个空字符串.

原来的建议解释说,这个标准regex_traits::transform_primary()如果只能工作collate在充满语言环境方面不是由用户(这是它能够知道如何转换结果的唯一方式取代collate::transform()以等价键).

我的问题是,typeid标准中的比较应如何确保?这是否意味着所有系统提供的方面都脱离了语言环境并use_facet具有_byname真正的动态类型?

c++ locale c++11

24
推荐指数
1
解决办法
709
查看次数

在编译时用C++生成随机数

我正在尝试random在编译时使用C++ 11的库预先计算随机值.我主要是按照例子.我在这做错了什么?

using namespace std;
#include <iostream>
#include <vector>
#include <random>

vector<double> rands;
typedef std::mt19937_64 RNG;
uint64_t seed_val;
RNG rng; 

void initialize() {
     rng.seed(seed_val);
}

constexpr vector<double> generate_random( )                 //size_t numbers)
{   
    int numbers = 1000;
    std::uniform_real_distribution<double> zero_one(0.0, 1.0);
        for (unsigned int i = 0; i < numbers; i++) { 
             double rand_num = zero_one(rng);
             rands.push_back( rand_num );
    }
    return rands;
}

int main()
{
    cout << "TMP rands";
    for_each( rands.begin(), rands.end(), [] (double value)
    {
        cout<<value<<endl;
    });
} …
Run Code Online (Sandbox Code Playgroud)

c++ random template-meta-programming c++11

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

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