我有一些理解MPL佔位符的麻煩。
有人請解釋我爲什麼這段代碼無法編譯?默認模板參數MPL佔位符替換
我期望打印數字0,1 & 2,但當編譯器試圖確定Wrapper的默認模板參數的類型時,似乎佔位符不會被實際類型替換。
#include <iostream>
#include <boost/mpl/inherit.hpp>
#include <boost/mpl/inherit_linearly.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/vector.hpp>
template <typename T> struct Traits;
template<> struct Traits<int> { typedef boost::mpl::int_<0> type; };
template<> struct Traits<char> { typedef boost::mpl::int_<1> type; };
template<> struct Traits<bool> { typedef boost::mpl::int_<2> type; };
template <typename T, typename Type=typename Traits<T>::type > struct Wrapper
{
Wrapper() { std::cout << "Value: " << Type::value << std::endl; }
T value;
};
int main()
{
typedef boost::mpl::inherit_linearly<
boost::mpl::vector<int, char, bool>,
boost::mpl::inherit<boost::mpl::_1, Wrapper<boost::mpl::_2> > >::type Object;
Object obj;
return 0;
}
這是從GCC-4.1.2的錯誤(我知道...舊的編譯器在工作)
# g++4 -I ../boost test.cpp -o test
test.cpp: In function 'int main()':
test.cpp:24: error: invalid use of undefined type 'struct Traits<mpl_::arg<2> >'
test.cpp:7: error: declaration of 'struct Traits<mpl_::arg<2> >'
test.cpp:24: error: template argument 2 is invalid
test.cpp:24: error: template argument 2 is invalid
test.cpp:24: error: template argument 2 is invalid
test.cpp:24: error: expected initializer before 'Object'
test.cpp:26: error: 'Object' was not declared in this scope
test.cpp:26: error: expected `;' before 'obj'
編輯: Acorbe的answer以下後,我做了一個變體我的示例程序中顯示爲什麼他提出的解決方案不符合我的需求。這說明了我在做什麼。在這種情況下,我希望打印文本TYPE_A,TYPE_B,TYPE_A。 g ++錯誤是一樣的。
#include <iostream>
#include <boost/mpl/inherit.hpp>
#include <boost/mpl/inherit_linearly.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/vector.hpp>
enum WrapperType { TYPE_A, TYPE_B };
template <typename T> struct Traits;
template<> struct Traits<int> { typedef boost::mpl::int_<TYPE_A> type; };
template<> struct Traits<char> { typedef boost::mpl::int_<TYPE_B> type; };
template<> struct Traits<bool> { typedef boost::mpl::int_<TYPE_A> type; };
template <typename T, typename Type=typename Traits<T>::type > struct Wrapper;
template <typename T>
struct Wrapper<T, boost::mpl::int_<TYPE_A> >
{
Wrapper() : value (0) { std::cout << "TYPE_A" << std::endl; }
T value;
};
template <typename T>
struct Wrapper<T, boost::mpl::int_<TYPE_B> >
{
Wrapper() { std::cout << "TYPE_B" << std::endl; }
T value;
};
int main()
{
typedef boost::mpl::inherit_linearly<
boost::mpl::vector<int, char, bool>,
boost::mpl::inherit<boost::mpl::_1, Wrapper<boost::mpl::_2> > >::type Object;
Object obj;
return 0;
}
這是從GCC-4.5.4
# g++ -I ../boost test.cpp -o test
test.cpp: In functie ‘int main()’:
test.cpp:37:79: fout: invalid use of incomplete type ‘struct Traits<mpl_::arg<2> >’
test.cpp:9:34: fout: declaration of ‘struct Traits<mpl_::arg<2> >’
test.cpp:37:79: fout: template argument 2 is invalid
test.cpp:37:81: fout: template argument 2 is invalid
test.cpp:37:83: fout: template argument 2 is invalid
test.cpp:37:91: fout: expected initializer before ‘Object’
test.cpp:39:9: fout: ‘Object’ was not declared in this scope
test.cpp:39:16: fout: expected ‘;’ before ‘obj’
這是(部分)從鐺++錯誤的錯誤 - 3.1:
test.cpp:15:50: error: implicit instantiation of undefined template 'Traits<mpl_::arg<2> >'
template <typename T, typename Type=typename Traits<T>::type > struct Wrapper;
^
test.cpp:37:57: note: in instantiation of default argument for 'Wrapper<mpl_::arg<2> >' required here
boost::mpl::inherit<boost::mpl::_1, Wrapper<boost::mpl::_2> > >::type Object;
^~~~~~~~~~~~~~~~~~~~~~~
test.cpp:9:34: note: template is declared here
template <typename T> struct Traits;
對於它的價值,我有2點建議:1。你沒有忘記做的'類型定義typename'而不僅僅是'typename'? 2.在'Wrapper'構造函數聲明中不需要''。 –
Acorbe
@Acorbe:只有從屬名稱需要''typename',這裏不是這種情況。然而第二點是有效的,在構造函數IIRC中說''實際上是一個錯誤。 –
Xeo
@Acorbe @Xeo:謝謝你的回覆。我不知道''是無效的。我已經從構造函數聲明中刪除它,這已經減少了一些錯誤。未定義類型的'無效使用'結構特性>''仍然不幸。 –
CodeWarrior