Попытка передать строковые литералы в качестве аргументов шаблона [duplicate]

На этот вопрос уже есть ответ здесь:

Передача строкового литерала в качестве параметра в шаблонный класс C ++ 12 ответов

Я пытаюсь найти удобный способ передачи строковых литералов в качестве аргументов шаблона. Я не забочусь о поддержке как можно большего числа компиляторов, я использую последнюю версию g ++ с--std=c++0x.

Я перепробовал множество возможных решений, но все меня разочаровали. Я как бы сдаюсь, но сначала хотелось бы узнатьПочему пара из них потерпела неудачу.

Они здесь:

#include <iostream>
#include <string>

using namespace std;

struct String {
    char const *m_sz;

    constexpr String(char const *a_sz)
        :
    m_sz(a_sz) {}

    char const *operator () () const {
        return m_sz;
    }
};

template<class _rstr>
string const Get() {
    return _rstr();
}

int main() {
    cout << Get<String("hello")>() << endl;
    return 0;
}

А также:

#include <iostream>
#include <string>

using namespace std;

struct String {
    char const *m_sz;

    constexpr String(char const *a_sz)
        :
    m_sz(a_sz) {}
};

template<String const &_rstr>
string const Get() {
    return _rstr.m_sz;
}

int main() {
    String constexpr str = "hello";
    cout << Get<str>() << endl;
    return 0;
}

Цель состояла в том, чтобы найти удобный способ передачи строкового литерала в бесполезную функцию Get, которая возвращает аргумент шаблона в виде объекта std :: string.

РЕДАКТИРОВАТЬ: извините, может быть, мой главный вопрос не ясен. Мой вопрос: почему эти два фрагмента терпят неудачу?

Ответы на вопрос(4)

Ваш ответ на вопрос