我試着寫一個模板類和輸出運算符將其如下:與可變參數模板包類模板輸出操作
#include <iostream>
namespace N
{
template< typename ...types >
struct X
{
static_assert((sizeof...(types) != 0), "zero length");
X() = default;
X(X const &) = default;
X(X &&) = default;
template< typename ...args >
//explicit // does not matter
X(args &&...) { ; }
int value = 10;
};
template< typename ...types >
std::ostream &
operator << (std::ostream & out, X<types...> const & x)
{
return out << x.value;
}
} // namespace N
int main()
{
using namespace N;
X<float> /*const*/ x; // `const` does not matter
std::cout << x << std::endl;
return 0;
}
但static_assert
離子提出:
main.cpp:9:5: error: static_assert failed "zero length"
static_assert((sizeof...(types) != 0), "zero length");
^ ~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:32:23: note: in instantiation of template class 'N::X<>' requested here
std::cout << x << std::endl;
^
1 error generated.
如果類模板X
和全局namespace
中定義的operator <<
重載全部相同。我發現,評論using namespace N;
行和替換X<float>
到N::X<float>
解決了這個問題。
如何解釋這種行爲?原因是什麼?
編輯:
我找到了解決辦法:是恰克超載operator <<
模板參數如下:
template< typename first, typename ...rest >
std::ostream &
operator << (std::ostream & out, X< first, rest... > const & x)
{
return out << x.value;
}
類的分裂typename ..types
不nessesarily。而且,由於代碼的嚴重膨脹而導致後果並不理想。
使用''\ n''而不是多餘的'std :: endl'修復了它。 – Cubbi