4

このコードをビルドしようとすると:

// foo.h
namespace foo {
    namespace bar {
        void put();
    }
}
#include "foo.h"
namespace foo {
    namespace {
        template<typename T>
        void put() { }
    }    
    void bar::put() {
        put<int>();
    };
}

エラーが発生します

foo.cpp: In function ‘void foo::bar::put()’:
foo.cpp: error: expected primary-expression before ‘int’
foo.cpp: error: expected ‘;’ before ‘int’

を参照するために をput<int>使用していることは明らかです。匿名名前空間で参照するにはどうすればよいですか?putbar::putput<T>

4

1 に答える 1

4

関数テンプレートの名前を完全修飾できます。

namespace foo {
    namespace bar {
        void put();
    }
}

namespace foo {
    namespace {
        template<typename T>
        void put() { }
    }
    void bar::put() {
        ::foo::put<int>();
    }
}

また、関数定義の後にセミコロンを使用する必要がないことに注意してください。

于 2013-02-28T14:07:05.307 に答える