在一个相当大的项目中,我想将相同的文件(或文件夹)放在不同的位置.在一个位置更改时,应传播更改.在Subversion中,我可以使用externals来实现这种行为.
我试图通过使用硬链接和符号链接来解决这个问题,但Mercurial似乎没有跟踪它们中的任何一个.相反,它将文件的内容提交到其存储库而不是link属性.当我克隆存储库时,信息会丢失.
这是Mercurial特定于Windows的行为还是根本无法跟踪链接?是否有其他方法可以跟踪可从Mercurial中的不同位置访问的文件?
我有以下简单示例,其中我想调用std::for_each一组不可复制的对象:
class A {
public:
A() : x(0) {}
A(const A&) = delete;
private:
int x;
};
void func() {
std::vector<A> v(10);
std::map<int, A> m;
// works as expected
std::for_each(begin(v), end(v), [](const A& a) { /* do nothing */ });
// error calling copy constructor
std::for_each(begin(m), end(m), [](const std::pair<int, A>& a) { /* do nothing */ });
}
Run Code Online (Sandbox Code Playgroud)
如果我把所有东西放进去std::vector,它就像我预期的那样工作,但是当使用a时std::map,突然std::for_each想要调用(删除的)复制构造函数.为什么?我原以为我只是获得了对地图中保存的对的引用,没有任何必要的副本.
在一个probject中我使用了类似于以下的代码:
class C {
public:
C() {}
C(const C&) = delete;
};
C f() {
return C();
}
int main() {
f();
}
Run Code Online (Sandbox Code Playgroud)
在我之前使用的每个Visual C++编译器中(直到2013年),这从来都不是问题.但是当我尝试使用新的Visual C++ 2015编译器编译它时,我收到以下错误:
1>c:\devel\c++11\playground\main.cpp(10): error C2280: 'C::C(const C &)': attempting to reference a deleted function
1> c:\devel\c++11\playground\main.cpp(6): note: see declaration of 'C::C'
Run Code Online (Sandbox Code Playgroud)
我不确定它为什么以前有效,但我认为由于返回值优化,默认构造函数被调用而不是复制构造函数.
我使用的代码甚至是合法的C++吗?如果没有,那么在不需要我的类的复制构造函数的情况下实现此代码的正确方法是C什么?我当然可以使用移动构造函数但是我认为代码在C++ 11之前从来就不是有效的C++?
我有几个Impl部分在CPP文件中实现的模板类(带有一些抽象方法),因此我需要显式实例化我的模板以供链接器找到它,如下所示:
template class Impl<T0>;
template class Impl<T1>;
template class Impl<T2>;
...
template class Impl<Tx>;
Run Code Online (Sandbox Code Playgroud)
随着类型数量的Tx增长,我想找到一种比在所有必需文件中手动扩展这些显式实例化列表更好的方法.我以为我可以为此使用可变参数模板,所以我尝试了以下方法:
template <template <class> class, class...>
struct type_map;
template <template <class> class BaseT, class... Ts>
struct type_map<BaseT, std::tuple<Ts...>> {
using type = std::tuple<BaseT<Ts>...>;
};
typedef std::tuple<T0, T1, T2> MyTypes;
Run Code Online (Sandbox Code Playgroud)
并在CPP文件中:
template class type_map<Impl, MyTypes>;
Run Code Online (Sandbox Code Playgroud)
但是,这并没有按照我的意图实例化模板(链接器抱怨丢失的符号).
有没有办法使这种方法工作(即实例化模板而不实例化它的对象)或一种完全不同的方法,可以在这种情况下解决我的问题?
我有一个类似于这个的类:
template <class T = char>
struct C {
T value;
};
Run Code Online (Sandbox Code Playgroud)
高达C++ 14,当我想使用默认模板参数时,我总是必须指定空尖括号:
void f() {
C<> c;
c.value = 'x';
}
Run Code Online (Sandbox Code Playgroud)
由于C++ 17支持类模板参数推导和显式推导指南,我想知道现在是否有办法使上面的代码工作而不指定空的尖括号:
void f() {
C c;
c.value = 'x';
}
Run Code Online (Sandbox Code Playgroud)
如果我用它编译它,这段代码在GCC 8.0中有效-std=gnu++17.但是,它仍然在Clang 6.0和Visual Studio 15.7中显示错误.哪种编译器在这种情况下是正确的?
我也试过指定这样的演绎指南:
C() -> C<char>;
Run Code Online (Sandbox Code Playgroud)
这也没有帮助.这是正确的语法还是有一种方法来为默认构造函数指定演绎指南?
由于某种原因,此排序代码无法正常工作:
std::fstream theFile;
theFile.open(<someFilename>, std::ios::beg |std::ios::out|std::ios::binary|std::ios::trunc);
theFile << 1; //1 is being written as a string
int var= 25;
theFile << 25; //same thing, 25 is written as a string
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?我正在使用Visual Studio 2010附带的Microsoft C++编译器.
我想使用lambda函数异步调用引用计数对象上的方法:
void RunAsync(const std::function<void()>& f) { /* ... */ }
SmartPtr<T> objPtr = ...
RunAsync([objPtr] { objPtr->Method(); });
Run Code Online (Sandbox Code Playgroud)
创建lambda表达式显然会创建一个副本,但我现在遇到的问题是将lambda表达式转换为std::function对象也会创建一堆智能指针的副本,每个副本都会增加引用计数.
以下代码应演示此行为:
#include <functional>
struct C {
C() {}
C(const C& c) { ++s_copies; }
void CallMe() const {}
static int s_copies;
};
int C::s_copies = 0;
void Apply(const std::function<void()>& fct) { fct(); }
int main() {
C c;
std::function<void()> f0 = [c] { c.CallMe(); };
Apply(f0);
// s_copies = 4
}
Run Code Online (Sandbox Code Playgroud)
虽然之后引用的数量恢复正常,但出于性能原因,我希望防止过多的引用操作.我不确定所有这些复制操作的来源.
有没有办法用更少的智能指针对象副本实现这一点?
更新:编译器是Visual Studio 2010.
我有一个问题,为初始化的迭代器分配一个未初始化.使用Visual Studio 2010构建时,以下代码摘录会产生访问冲突.在以前版本的Visual Studio中,代码应该可以正常工作.
#include <list>
int main() {
std::list<int> list;
std::list<int>::iterator it = list.begin();
std::list<int>::iterator jt;
it = jt; // crashes in VS 2010
}
Run Code Online (Sandbox Code Playgroud)
这不会被视为有效的C++吗?
我需要这段代码来实现一个"游标"类,它既可以指向任何地方,也可以指向列表中的特定元素.如果我没有对容器的引用,我还可以将其用作未初始化迭代器的值?