2

ブラケット演算子のテンプレート関数を持つクラスがあります。コンパイルはできますが、アクセス方法がわかりません。

以下の例を参照してください。

   class Test {
    public:
        template <class T> pServiceState operator[] (const std::string project) {
             return getService<T>(project);
        }

       template <class T> pServiceState getService(const std::string project) {
             pService s = get_service<T>();
             if(s == NULL) throw "Service does not exist on server";
             return s->state(project);
        }

    }

int main(){

    states.getService<content_uploader>("asd"); // Works
    states<content_uploader>["asd"]; // Throws syntax errors.

/*
error: expected primary-expression before ‘&gt;’ token
error: expected primary-expression before ‘[’ token
*/


}

助けてくれてありがとう、アダム

4

1 に答える 1

5

あなたの場合、コンパイラは引数からテンプレートパラメータを導出できないためT、指定する必要があります。構文は、通常の関数の構文と似ています。だから、試してみてください:states.operator[]<content_uploader>("asd")

例:

#include <iostream>
#include <vector>

class Foo
{
public:
    Foo() : vec(5, 1) {}
    template <typename T>
    int operator[](size_t index)
    {
        std::cout << "calling [] with " << index << std::endl;
        return vec[index];
    }
private:
    std::vector<int> vec;
};

int main()
{
    Foo foo;
    foo.operator[]<int>(2);
}
于 2012-07-19T20:53:19.000 に答える