假设我有一个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.o和namespace2_someclass.o这样的东西?
是的,我可以将我的类放到一个目录中,并将它们命名为namespace1_someclass.cpp和namespace2_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到目前为止它的工作非常出色 - 除了对象文件的放置.
QString比std :: string有什么优势?普通的std :: string可以存储unicode字符吗?我正在尝试编写一个可以打开各种歌曲文件的程序.这些文件的名称可以使用不同的语言.我听说在这种情况下使用普通字符串将无法正常工作.我想保持应用程序独立于QT并重用代码,例如在android中.你有什么建议
我们知道如果我们尝试使用std::mapoperator [] 访问不存在的键,该函数将使用该键插入一个新元素.
我们有: std::map<std::string, bool> map_xxx;
是否保证在访问不存在的密钥后map_xxx["nonexistent_key"],第二个参数的值将始终为false?
PS.如果没有,任何想法如何有这种行为?
我无法想出一个适当的问题标题来描述问题.希望下面的细节清楚地解释了我的问题.
请考虑以下代码
#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) 很多时候,当我使用拼写错误或其他类型的输入不匹配来编译某些东西时,我得到了标准的"错误:在...中没有匹配'functionname'"错误.这很棒.然后,特别是在重载函数和运算符的情况下,g ++继续并列出10页的候选者,这些页面只是可怕的和大量的模板定义.
错误消息很棒,但有没有办法禁止它建议其他功能变体?
我正在设计一个具有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) 我有一个类似于下面的函数,它是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)
(即非常数)
对我来说,像这样的函数 - 显然是一个纯粹的访问器 - 似乎有点奇怪 - 应该是非常量的.背后的逻辑是否合理?
为了给出我正在讨论的内容,下面的程序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真正的动态类型?
我正在尝试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++ ×10
c++11 ×2
qt ×2
constructor ×1
crtp ×1
g++ ×1
locale ×1
map ×1
new-operator ×1
ofstream ×1
qmake ×1
qt-creator ×1
random ×1
shellexecute ×1
stdvector ×1
stl ×1
string ×1
uac ×1
unicode ×1
winapi ×1