为什么C++标准指定模板中的非限定名称是非依赖的?
例如
template<typename T>
class Base
{
public:
T x;
};
template<typename T>
class C : public Base<T>
{
public:
bool m() { return x == 0; } // Error: undeclared identifier 'x'
};
Run Code Online (Sandbox Code Playgroud)
引用一个关于如何克服限制的SO 问题的接受答案:
该标准指定模板中的非限定名称是非依赖的,并且必须在定义模板时查找.当时未知依赖基类的定义(可能存在基类模板的特化),因此无法解析非限定名称.
但是,引用和其他答案没有说明为什么这是标准指定的内容.这种限制的理由是什么?
以下之间有功能差异吗?有什么理由更喜欢其中一种吗?
auto p = new C();
Run Code Online (Sandbox Code Playgroud)
和
auto* p = new C();
Run Code Online (Sandbox Code Playgroud) 在C++中是否有任何可接受的方法来区分对不可变对象的const引用与可变对象的const引用?
例如
class DataBuffer {
// ...
};
class Params {
// ...
};
class C {
public:
// Given references must be valid during instance lifetime.
C(const Params& immutableParameters, const DataBuffer& mutableDataBuffer) :
m_immutableParameters{immutableParameters},
m_mutableDataBuffer{mutableDataBuffer}
{
}
void processBuffer();
private:
const Params& m_immutableParameters;
const DataBuffer& m_mutableDataBuffer;
};
Run Code Online (Sandbox Code Playgroud)
这里的语义差异仅在名称中给出.
问题是const&实例变量只让您知道该实例不会修改该对象.界面中没有区别是否可以在其他地方修改它们,我认为这是一个有用的功能,能够在界面中进行描述.
通过类型系统表达这一点将有助于使接口更清晰,允许编译器捕获错误(例如C,在上面的示例中意外修改传递给实例的参数,在实例之外),并且可能有助于编译器优化.
假设答案是在C++中无法区分,可能有些东西可以通过一些模板魔术来实现吗?
我正在使用TortoiseSVN进行我的C++项目,并试图将一个分支"重新集成"回到主干中.
我的情况很简单,因此对于分支中已更改的每个文件,我希望它完全覆盖主干中的匹配文件.不幸的是,TortoiseSVN比我聪明,所以它合并了每对文件 - 导致一些不一致的代码.例如,已在合并版本中恢复已在分支中删除的一些代码行.
有没有办法强迫TortoiseSVN使用覆盖所有修改过的文件的天真合并行为?
谢谢,丹
有没有办法比较XCode中两个SVN修订版之间的所有更改?
(我知道如何查看比较单一的文件,使用的XCode 4的源代码控制视图模式,并且知道如何查看组织者的仓库部分一个版本中引入的更改.)
我对每天花在建设项目上的时间感兴趣.是否有现有工具提供此类统计数据?
谢谢!
我试图找到一个键盘快捷方式,只在VS2008中构建启动项目.
我只找到了一个可配置的快捷方式来构建当前查看的项目,这不是很好.
有任何想法吗?
谢谢.
NSObject的保留方法是原子的吗?
例如,当从两个不同的线程保留相同的对象时,它是否承诺保留计数增加了两倍,或者保留计数是否可能只增加一次?
谢谢.
我正在使用a AVAssetReaderOutput来读取a中的样本AVAsset,对它们进行一些处理,并使用RemoteIO AU播放结果.
问题是,在调用AudioOutputUnitStop暂停播放后,在转到后台并返回前台后,调用后音频将不会再次启动AudioOutputUnitStart.这是由于copyNextSampleBuffer方法返回的错误,该错误AVAssetReaderOutput被称为渲染管道的一部分.
调用之后的status属性是,其属性为Error Domain = AVFoundationErrorDomain Code = -11847"Operation Interrupted"UserInfo = 0x1d8b6100 {NSLocalizedRecoverySuggestion =停止其他操作并再试一次.,NSLocalizedDescription = Operation Interrupted}AVAssetReadercopyNextSampleBufferAVAssetReaderStatusFailederror
我正在寻找一种解决方案,它不会强迫我在回到前台后重新初始化整个管道 - 希望有这样一个解决方案,AVAssetReaders可以在应用程序进入后台并返回...
笔记
AVAudioSession在AVAudioSessionDelegates endInterruptionWithFlags:事件和应用程序变为活动状态时将我设置为活动状态.无论我是否这样做都没有区别,得到同样的错误.一些代码:
AudioPlayer
@implementation AudioPlayer
...
// Audio Unit Setup
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
AudioComponent defaultOutput …Run Code Online (Sandbox Code Playgroud) 将指向数据成员的指针传递给基类构造函数是否安全?即,即使数据成员尚未初始化,至少已经在调用基类构造函数之前设置了派生类数据成员的内存布局?
显然,只有在构造完成后才能取消引用指针,并且指向的对象已经有效.但问题是,如果确保派生对象的构造完成后,基类构造函数接收的指针实际上仍然指向它们的对象.
动机是在基类中提供一些功能,例如迭代构造时提供的指针到对象,并在以后为每个对象做一些事情.
可以只提供派生类可访问的setter,但我很好奇是否在构造时提供指针也是安全的.
例:
#include <iostream>
#include <utility>
#include <vector>
struct Base {
Base(std::initializer_list<int*> ptrs = {}) : ptrs_(ptrs) {}
std::vector<int*> ptrs_;
};
struct Derived : public Base {
Derived() : Base{{&a_,&b_,&c_}} {}
int a_=1, b_=2, c_=3;
};
int main()
{
Derived obj;
for (auto* ptr : obj.ptrs_) { std::cout << *ptr << '\n'; }
}
Run Code Online (Sandbox Code Playgroud)
c++ ×4
ios ×2
svn ×2
atomic ×1
audiounit ×1
auto ×1
branch ×1
build ×1
c++11 ×1
cocoa ×1
constructor ×1
core-audio ×1
inheritance ×1
merge ×1
retain ×1
templates ×1
tortoisesvn ×1
xcode ×1