我試圖使用自定義類的即時作爲模板參數。與自定義對象的常量表達式
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
編譯器指出x
不能出現在常量表達式中。爲什麼?在編譯時有一些東西給構造這個對象。
我試圖使用自定義類的即時作爲模板參數。與自定義對象的常量表達式
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
編譯器指出x
不能出現在常量表達式中。爲什麼?在編譯時有一些東西給構造這個對象。
你不能這樣做。標準14.1說:
甲非類型模板參數應具有下列(任選CV修飾)類型之一:
- 積分或枚舉類型,
- 指向對象或指針以功能,
- 對對象或引用功能的引用,
- 指向成員的指針。
[注:其它類型的是不允許明確地低於或隱式地通過管轄模板參數 (14.3)的形式的規則。結束符]確定模板參數 類型時,將忽略模板參數上的頂級cv限定符。
模板參數可以是類型或積分常量。 X
是一種類型,但是x
不是。你也不能使用常量浮點值。
正如其他人指出你不能這樣做。只要你不玩元編程遊戲,通過一個類的實際實例的正常方式是在構造函數中:
template <class Foo>
struct Bar {
Bar(const Foo & f) {
...
}
};
哪些* *很多選項畢竟。任何POD(不包括浮點值和動態指針)都可以被翻譯成一個模板,它不能被編譯器自動轉換。 – Potatoswatter 2010-03-26 08:38:10
在C++ 0x中,我們最終允許將類類型作爲參數傳遞,只要它們具有constexpr轉換函數爲整型或枚舉類型即可。 – 2010-03-31 17:41:55