一些背景:我正在編寫一個基於策略的智能指針(如Loki庫中的SmartPtr),它可以具有像auto_ptr這樣的破壞性複製語義。因此,它需要有一個模板拷貝構造函數來取得非const引用來修改被拷貝的對象。複製構造函數中的「Template typedef」不起作用
我想要做的是參數化複製構造函數通過策略中的某個變量的參數的常量,以便在不希望使用破壞性複製語義時使其成爲常量。下面是我想到的簡化代碼,但不幸的是,它不起作用,因爲編譯器無法推導出模板參數。我有沒有其他技術可以用來實現所需的行爲?
template <typename T, bool isEnabled> struct AddConst {
typedef T Type;
};
template <typename T> struct AddConst<T, true> {
typedef const T Type;
};
struct MyCopyPolicy {
static const bool kIsCopyArgConst = true;
};
template <typename T, class CopyPolicy> struct Foo {
// A helper struct to achieve "template typedef".
template <typename T2> struct CopyArg {
typedef typename AddConst<Foo<T2, CopyPolicy>,
CopyPolicy::kIsCopyArgConst>::Type Type;
};
Foo() {}
// Template copy constructor. Doesn't work.
template <typename T2> Foo(typename CopyArg<T2>::Type& rhs) {}
};
int main() {
Foo<int, MyCopyPolicy> foo1;
Foo<double, MyCopyPolicy> foo2 = foo1; // error!
}
你有一個「非推斷的上下文」的問題,類似於這裏 。問題在於編譯器無法確定T2,而沒有爲所有**可能的類型實例化CopyArg並比較它們的嵌套類型。 –
2011-03-16 22:40:02