ここで私はいくつかの段階で必要な小さな研究をしています。const型のC++テンプレートの一般化
私はラインが
const char t[] = "ABC";
私が取得する<-- HERE
をマーク変更した場合、次の
小さな例は今、この(http://coliru.stacked-crooked.com/a/75c29cddbe6d8ef6)
#include <iostream>
template <class T>
class funny
{
public:
funny(T& a) : v(a) {v -= 1; }
virtual ~funny() { v += 1; }
operator T() {return v;}
private:
T& v;
};
#define V(a) funny<decltype(a)>(a)
int main()
{
char t[] = "ABC"; // <-- HERE
if(V(t[0]) == (char)'A')
{
std::cout << "Pass" << t[0];
}
else
{
std::cout << "No Pass" << t[0];
}
}
のようなものです、質問が来ますコンパイルエラー:
main.cpp: In instantiation of 'funny<T>::funny(T&) [with T = const char&]':
main.cpp:21:7: required from here
main.cpp:7:28: error: assignment of read-only location '((funny<const char&>*)this)->funny<const char&>::v'
funny(T& a) : v(a) {v -= 1; }
~~^~~~
main.cpp: In instantiation of 'funny<T>::~funny() [with T = const char&]':
main.cpp:21:7: required from here
main.cpp:8:27: error: assignment of read-only location '((funny<const char&>*)this)->funny<const char&>::v'
virtual ~funny() { v += 1; }
~~^~~~
私は定数を修正しようとしているので、これは完全に理解できます。コンパイラはここにあります。しかし、私は本当にこれがconstのデータのためにも動作する必要があるので、私は、テンプレートのconstの専門作成しようとしました:
template <class T>
class funny <T const>
{
public:
funny(const T& a) : v(a) {}
operator T() {return v;}
private:
const T& v;
};
しかしかかわらず、コンパイラは、それを見つけることはありませんが、まだ非をコンパイルしようとしますconstバージョン。
この問題を解決する方法はありますか?あなたが変更した場合
をconstで修飾されていない( 'T'は' X 'で 'X'は' const char'です)。これは、 't [0]'が式であり、式としての左辺値であるためです。そのような式の 'decltype(e)'は左辺参照型を生成します。 – dyp