Разрешение пространства имен C++

Когда я пытаюсь построить этот код:

// 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> использует put ссылаясь на bar::put, Как я могу сделать это относится к put<T> в анонимном пространстве имен?

1 ответ

Решение

Вы можете полностью определить имя шаблона функции:

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

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

Также обратите внимание, что вам не нужно использовать точку с запятой после определения функции.

Другие вопросы по тегам