2010-03-26 18 views
1

我試圖使用自定義類的即時作爲模板參數。與自定義對象的常量表達式

class X { 
public: 
    X() {}; 
}; 

template <class Foo, Foo foo> 
struct Bar { 

}; 
const X x; 
Bar<X, x> foo; 

編譯器指出x不能出現在常量表達式中。爲什麼?在編譯時有一些東西給構造這個對象。

回答

7

你不能這樣做。標準14.1說:

甲非類型模板參數應具有下列(任選CV修飾)類型之一:
- 積分或枚舉類型,
- 指向對象或指針以功能,
- 對對象或引用功能的引用,
- 指向成員的指針。
[注:其它類型的是不允許明確地低於或隱式地通過管轄模板參數 (14.3)的形式的規則。結束符]確定模板參數 類型時,將忽略模板參數上的頂級cv限定符。

+0

哪些* *很多選項畢竟。任何POD(不包括浮點值和動態指針)都可以被翻譯成一個模板,它不能被編譯器自動轉換。 – Potatoswatter 2010-03-26 08:38:10

+0

在C++ 0x中,我們最終允許將類類型作爲參數傳遞,只要它們具有constexpr轉換函數爲整型或枚舉類型即可。 – 2010-03-31 17:41:55

-1

模板參數可以是類型或積分常量。 X是一種類型,但是x不是。你也不能使用常量浮點值。

0

正如其他人指出你不能這樣做。只要你不玩元編程遊戲,通過一個類的實際實例的正常方式是在構造函數中:

template <class Foo> 
struct Bar { 
    Bar(const Foo & f) { 
     ... 
    } 
};